演習として、F# でかなり標準的な方法でレーベンシュタイン距離を実装しました。
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
(末尾再帰に簡単に変換できます)