次の関数では、アキュムレータを使用して末尾再帰を設定しようとしました。ただし、スタックオーバーフローの例外が発生しているため、関数を設定する方法で末尾再帰が正しく有効になっていないと思われます。
//F# attempting to make a tail recursive call via accumulator
let rec calc acc startNum =
match startNum with
| d when d = 1 -> List.rev (d::acc)
| e when e%2 = 0 -> calc (e::acc) (e/2)
| _ -> calc (startNum::acc) (startNum * 3 + 1)
acc
を使用すると、各パスの結果をaccに詰め込み、各フレームから返すことができるため、コンパイラは、再帰呼び出しごとにすべてのスタックフレームを保持する必要がないことを確認できると理解しています。コンパイラが末尾呼び出しを行うように、アキュムレータ値を正しく使用する方法について私が理解していないことが明らかにあります。