次のような関数があるとします。
user=> (def m {10 5, 5 2, 2 1})
#'user/m
user=> (defn hierarchy [x] (when x (cons x (hierarchy (get m x)))))
#'user/hierarchy
user=> (hierarchy 10)
(10 5 2 1)
user=>
スタックの深さが小さいため、ここでは明らかにこれで問題ありません。しかし、私が返したいリストを作成しているこの一般的なタイプの問題では、再帰呼び出しは常にコンス呼び出し内で終了します。これを末尾再帰に変換して、再帰を使用し、スタック スペースを使用しないようにするにはどうすればよいでしょうか。