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

标签 indexing slice d

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

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/

相关文章:

sql-server - 大表分区——索引

Java 方法与字符的混淆

geometry - 如何用一条线切割一个简单的多边形

ms-word - 如何在将其用作 zip 存档后制作正确的 docx?

python - 列表中最后一次出现的不是字符串的项目 - Python

ArrayList 的 java.lang.IndexOutOfBoundsException

python - 如何对 Python 列表进行切片,以便将列移动为单独的元素列?

python - 切片和赋值唯一顺序索引的多索引 Pandas 数据框

d - std.complex 的设计背后的原因是什么?

garbage-collection - d 垃圾收集器和实时应用程序