我在 F# 中以非常标准的方式实现了 Levenshtein Distance 作为练习
let lastchar (s:string) = s.Substring(s.Length-1, 1)
let lastchar_substring (s:string) len = s.Substring(len-1, 1)
let rec levdist (sa:string) (sb:string) alen blen = match alen, blen with
| -1, -1 -> levdist sa sb sa.Length sb.Length
| 0, 0 -> 0
| _ , 0 -> alen
| 0, _ -> blen
| _ -> List.min [ (* How do I make this tail recursive...? *)
(levdist sa sb (alen-1) blen) + 1;
(levdist sa sb alen (blen-1)) + 1;
(levdist sa sb (alen-1) (blen-1)) +
match (lastchar_substring sa alen), (lastchar_substring sb blen) with
| x, y when x = y -> 0
| _ -> 1
])
但是,我看不到将 List.min 调用转换为尾递归的简单方法。我们不只是在递归调用之后做一些额外的、独立的计算;相反,我们选择了多次递归调用的结果。
有没有办法优雅地将其转换为尾递归?
(我可以轻松地将 转换+1
为尾递归)