gpt4 book ai didi

indexing - 为什么在递归调用中索引字符串会产生不同的结果?

转载 作者:行者123 更新时间:2023-12-04 10:03:32 26 4
gpt4 key购买 nike

在我的编辑距离查找器的幼稚实现中,我必须检查两个字符串的最后一个字符是否匹配:

ulong editDistance(const string a, const string b) {
if (a.length == 0)
return b.length;
if (b.length == 0)
return a.length;

const auto delt = a[$ - 1] == b[$ - 1] ? 0 : 1;

import std.algorithm : min;

return min(
editDistance(a[0 .. $ - 1], b[0 .. $ - 1]) + delt,
editDistance(a, b[0 .. $ - 1]) + 1,
editDistance(a[0 .. $ - 1], b) + 1
);
}
这会产生预期的结果,但如果我替换 delt根据它的定义,它总是在非空字符串上返回 1:
ulong editDistance(const string a, const string b) {
if (a.length == 0)
return b.length;
if (b.length == 0)
return a.length;

//const auto delt = a[$ - 1] == b[$ - 1] ? 0 : 1;

import std.algorithm : min;

return min(
editDistance(a[0 .. $ - 1], b[0 .. $ - 1]) + a[$ - 1] == b[$ - 1] ? 0 : 1, //delt,
editDistance(a, b[0 .. $ - 1]) + 1,
editDistance(a[0 .. $ - 1], b) + 1
);
}
为什么这个结果会改变?

最佳答案

运算符的优先级与您期望的不同。在 const auto delt = a[$ - 1] == b[$ - 1] ? 0 : 1;没有歧义,但在 editDistance(a[0 .. $ - 1], b[0 .. $ - 1]) + a[$ - 1] == b[$ - 1] ? 0 : 1 ,有(貌似)。

简化:

auto tmp = editDistance2(a[0..$-1], b[0..$-1]);
return min(tmp + a[$-1] == b[$-1] ? 0 : 1),
//...
);

这里有趣的部分被解析为 (tmp + a[$-1]) == b[$-1] ? 0 : 1 , 和 tmp + a[$-1]不等于 b[$-1] .解决方案是用括号括起来:

editDistance(a[0 .. $ - 1], b[0 .. $ - 1]) + (a[$ - 1] == b[$ - 1] ? 0 : 1)

关于indexing - 为什么在递归调用中索引字符串会产生不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61707979/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com