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

侯赛因·阿德南(Hossain Adnan)

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

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
    );
}

为什么这个结果会改变?

BioTronic

运营商的优先级与您期望的不同。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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在PHP中两个字符串的加号“ +”会产生此结果?

为什么类型/ var为null会产生不同的结果?

为什么使用'=='或'is'比较字符串有时会产生不同的结果?

如果在字符串文字中调用,为什么在字符串上调用removeAtIndex:会反转结果?

为什么将字符串文字分配为结构的字符数组成员的值会产生错误?

为什么NumPy高级索引对于列表列表和numpy数组会产生不同的结果?

在 JS 中,为什么 event.target 会根据它是在模板文字中还是添加到字符串中给出不同的结果

为什么以下字符串比较返回不同的结果?

为什么不同的查询值会产生不同的索引算法?

为什么python字符串中的负索引没有按预期结果?

为什么不同的scrypt实现会产生不同的结果?

从字符声明字符串会产生意外结果。为什么会这样呢?

为什么字符串比较结果始终为假

为什么在Chrome中存储为变量“名称”的数组会转换为字符串?

为什么打印字符指针会产生字符串而不是内存地址?

为什么使用引号时“ wsl”会产生不同的结果?

为什么使用getClientRects()的相同代码会产生不同的结果?

SQL在从句中,为什么会产生不同的结果?

为什么这些作业会产生不同的结果?

为什么==和equals会产生不同的结果?

为什么确定系数R²实现会产生不同的结果?

为什么Python的“ .split()和”“ .split(”,“)会产生不同的结果?

为什么我的Cypher查询会产生不同的结果?

为什么这个几乎相同的代码会产生不同的结果

为什么在Firefox,Chrome和IE中在float上使用toString()会产生不同的结果?

为什么Go中的float常量和变量会产生不同的结果?

为什么在2个不同的cpp文件中定义内联全局函数会产生神奇的结果?

为什么在Python中的时区之间进行转换会产生不同的结果?

为什么Python 3和C中的if语句会产生不同的结果?