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

问题描述 投票:0回答: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]) + 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
    );
}

为什么这个结果会改变?

indexing slice d
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.