You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

C++新手递归实现编辑距离时遇到报错:called object type 'int' is not a function or function pointer

解决你的C++编辑距离递归实现错误

嘿,我来帮你排查这个问题!你遇到的error: called object type 'int' is not a function or function pointer是有明确原因的,咱们一步步来解决:

错误根源:std::min的参数数量不对

C++标准库提供的std::min函数只支持最多2个参数,但你在distance函数里一口气传了3个值进去:

return min( distance(v, v2, a, b-1)+1, distance(v, v2, a-1, b)+1, distance(v, v2, a-1, b-1)+cost(v, v2, a, b));

编译器处理这段代码时,会先计算前两个参数的min,得到一个int类型的结果。然后它会误以为你要把这个int当成函数来调用第三个参数(就像写了min(a,b)(c)),但int显然不是函数或函数指针,所以就抛出了这个错误。

解决方法:调整min的调用方式

有两种简单的方式可以解决这个问题:

方式1:嵌套调用std::min

把三个参数的最小值计算拆成两次min调用,先算前两个的最小值,再和第三个值比较:

return min( 
    min(distance(v, v2, a, b-1)+1, distance(v, v2, a-1, b)+1), 
    distance(v, v2, a-1, b-1)+cost(v, v2, a, b) 
);

方式2:使用初始化列表版本的std::min(C++11及以上)

如果你用的是C++11或更高版本,可以用std::min的初始化列表重载,但需要先包含<algorithm>头文件(标准库的min定义在这里):

  1. 在代码开头添加:
#include <algorithm>
  1. 修改return语句为:
return min( { 
    distance(v, v2, a, b-1)+1, 
    distance(v, v2, a-1, b)+1, 
    distance(v, v2, a-1, b-1)+cost(v, v2, a, b) 
} );

这种方式更直观,直接把所有要比较的值放在初始化列表里即可。

额外的优化与修正

除了错误本身,你的代码还有两个可以改进的地方:

1. 修正递归边界条件

当前的边界条件if (a==0) return b; if (b==0) return a;是错误的,会导致计算结果不准确。正确的逻辑应该是:

  • 当第一个字符串已经处理完所有字符(a < 0),需要插入b+1个字符才能匹配第二个字符串
  • 当第二个字符串已经处理完所有字符(b < 0),需要删除a+1个字符才能匹配第一个字符串

修改后的边界代码:

if (a < 0) return b + 1;
if (b < 0) return a + 1;

2. 传递字符串的const引用

你的函数参数是string v,每次递归都会复制整个字符串,非常影响性能。改成const string& v可以避免不必要的拷贝:

// 函数声明
int distance(const string&, const string&, int, int);
int cost(const string&, const string&, int, int);

// 函数定义
int distance(const string& v, const string& v2, int a, int b) {
    // ... 内部代码不变
}
int cost(const string& v, const string& v1, int a, int b) {
    // ... 内部代码不变
}

修正后的完整代码

#include <iostream>
#include <string>
#include <algorithm> // 新增,用于std::min的初始化列表版本
using namespace std;

int distance(const string&, const string&, int, int);
int cost(const string&, const string&, int, int);

int main(){
    string v = "love";
    string v2 = "hate";
    cout << distance(v, v2, v.size()-1, v2.size()-1) << endl;
}

int distance(const string& v, const string& v2, int a, int b) {
    if (a < 0) return b + 1;
    if (b < 0) return a + 1;
    return min( 
        min(distance(v, v2, a, b-1)+1, distance(v, v2, a-1, b)+1), 
        distance(v, v2, a-1, b-1)+cost(v, v2, a, b) 
    );
}

int cost(const string& v, const string& v1, int a, int b) {
    return (v[a] == v1[b]) ? 0 : 1;
}

内容的提问来源于stack exchange,提问作者Mohammed AL-Nashriy

火山引擎 最新活动