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

侯赛因·阿德南(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条评论
登录后参与评论

相关文章

来自分类Dev

为什么在字符串数组上使用Array.map(parseInt)会产生不同的结果

来自分类Dev

为什么setTimeout调用会产生不同的结果

来自分类Dev

为什么数字字符串比较会产生意外结果?

来自分类Dev

简单的字符串操作会在Linux版本之间产生不同的结果-为什么?

来自分类Dev

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

来自分类Dev

无法为字符串“ foo”编制索引

来自分类Dev

为什么将as.Date应用于xts索引会产生不同的结果?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

为什么Base64.decode为不同的字符串产生相同的字节数组?

来自分类Dev

为什么将零除为整数基元会产生不同的结果?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

为什么Round会产生与Application.Round不同的结果

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

从字符串解析int会产生错误的结果

来自分类Dev

为什么从字符串转换为int会产生奇怪的值

来自分类Dev

为什么字符串索引在JavaScript数组中合法?

Related 相关文章

  1. 1

    为什么在字符串数组上使用Array.map(parseInt)会产生不同的结果

  2. 2

    为什么setTimeout调用会产生不同的结果

  3. 3

    为什么数字字符串比较会产生意外结果?

  4. 4

    简单的字符串操作会在Linux版本之间产生不同的结果-为什么?

  5. 5

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

  6. 6

    无法为字符串“ foo”编制索引

  7. 7

    为什么将as.Date应用于xts索引会产生不同的结果?

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

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

  14. 14

    为什么Base64.decode为不同的字符串产生相同的字节数组?

  15. 15

    为什么将零除为整数基元会产生不同的结果?

  16. 16

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

  17. 17

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

  18. 18

    为什么Round会产生与Application.Round不同的结果

  19. 19

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

  20. 20

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

  21. 21

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

  22. 22

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

  23. 23

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

  24. 24

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

  25. 25

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

  26. 26

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

  27. 27

    从字符串解析int会产生错误的结果

  28. 28

    为什么从字符串转换为int会产生奇怪的值

  29. 29

    为什么字符串索引在JavaScript数组中合法?

热门标签

归档