Indexing 为什么对递归调用中的字符串进行索引会产生不同的结果?
在编辑测距仪的简单实现中,我必须检查两个字符串的最后一个字符是否匹配:Indexing 为什么对递归调用中的字符串进行索引会产生不同的结果?,indexing,slice,d,Indexing,Slice,D,在编辑测距仪的简单实现中,我必须检查两个字符串的最后一个字符是否匹配: ulong editDistance(常量字符串a、常量字符串b){ 如果(a.length==0) 返回b.length; 如果(b.length==0) 返回a.length; 常数自动增量=a[$-1]==b[$-1]?0:1; 导入标准算法:min; 返回最小值( 编辑距离(a[0..$-1],b[0..$-1])+delt, 编辑距离(a,b[0..$-1])+1, 编辑距离(a[0..$-1],b)+1 ); }
ulong editDistance(常量字符串a、常量字符串b){
如果(a.length==0)
返回b.length;
如果(b.length==0)
返回a.length;
常数自动增量=a[$-1]==b[$-1]?0:1;
导入标准算法:min;
返回最小值(
编辑距离(a[0..$-1],b[0..$-1])+delt,
编辑距离(a,b[0..$-1])+1,
编辑距离(a[0..$-1],b)+1
);
}
这会产生预期的结果,但如果我用其定义替换delt
,则非空字符串总是返回1:
ulong editDistance(常量字符串a、常量字符串b){
如果(a.length==0)
返回b.length;
如果(b.length==0)
返回a.length;
//常数自动增量=a[$-1]==b[$-1]?0:1;
导入标准算法:min;
返回最小值(
editDistance(a[0..$-1],b[0..$-1])+a[$-1]==b[$-1]?0:1,//delt,
编辑距离(a,b[0..$-1])+1,
编辑距离(a[0..$-1],b)+1
);
}
为什么这个结果会改变?
运算符的优先级与您期望的不同。在const auto delt=a[$-1]==b[$-1]中?0 : 1;代码>没有歧义,但在编辑距离(a[0..$-1],b[0..$-1])+a[$-1]==b[$-1]?0:1
,有(看起来)
简化:
auto-tmp=editDistance2(a[0..$-1],b[0..$-1]);
返回最小值(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)