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定义在这里):
- 在代码开头添加:
#include <algorithm>
- 修改
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




