末尾再帰で階乗を計算する関数
gosh> (define (fact-tailrec n acc) (if (= n 1) acc (fact-tailrec (- n 1) (* n acc)))) fact-tailrec gosh> (fact-tailrec 5 1) 120
letを使用して局所的な関数を定義することができ、これで末尾再帰がかけるようです。letの後ろが関数名で、その後に定義する変数には初期値が設定できるようです。
参照したURL:
http://www.geocities.jp/m_hiroi/func/abcscm04.html
letを使用して関数を書いてみる
gosh> (define (fact n) (let loop ((n n) (acc 1)) (if (= n 1) acc (loop (- n 1) (* n acc)))) ) fact gosh> (fact 5) 120 gosh> (fact 10) 3628800 gosh> (define (fact n) (let iter ((n n) (acc 1)) (if (= n 1) acc (iter (- n 1) (* n acc)))) ) fact gosh> (fact 5) 120 gosh> (fact 10) 3628800
loopっていうあらかじめ用意されている関数があるのかと思っていましたが、letで定義していたんですね。