星田さんの記事に対するちょっとした補足。
![](https://blogimg.goo.ne.jp/user_image/54/97/af08ac2ad34764c93eb6345d6d7ae60d.png)
累乗の計算を末尾再帰で行うのに、名前付きletとそうじゃないのを見比べたりとか・・
ちなみに、今まであんま言わなかったんだけど、Racketにはオプショナル引数と言う機能があって、こういう風にも書けます。
(define (pow5 x n (acc 1))
(if (zero? n)
acc
(pow5 x (- n 1) (* acc x))))
![](https://blogimg.goo.ne.jp/user_image/7a/ae/9d9e756036f20fd9b13006e0f5ab7e6e.png)
オプショナル引数はパラメータリストに「デフォルト値を指定したリスト」を引数として与える方式で作成出来て、「特に関数呼び出しの際にそれを指定しない場合、デフォルト値が使われる」方式です(写真見れば分かるでしょうが、3引数で作った関数pow5は2引数でも平気で起動する)。
Schemeと言うよりはANSI Common Lispで良く使われる手で、それもこれもANSI Common Lispには名前付きletがないので、代わりに末尾再帰を書くショートカットとして良く使われるんで、まぁ、覚えておいて損はないでしょう。
もう1つ、余談としては、この「累乗の計算」は再帰を使わず、foldlを使えば一行で書ける、と気づけばこの辺は免許皆伝でしょう。
(define (pow6 x n)
(foldl * 1 (make-list n x)))
![](https://blogimg.goo.ne.jp/user_image/6a/4e/a7ebd3812bb346bd6ed44990434bae40.png)
当然、foldlの中身は再帰関数なんだけど、もっとズルをすれば実はapplyが使える。
(define (pow7 x n)
(apply * (make-list n x)))
![](https://blogimg.goo.ne.jp/user_image/73/f7/c0a099bca02475a0ed8328d5289f62a1.png)
この辺の細かいテクニックを見るには、「新規の学習はせずにScheme入門的なサイトで復習」ってのは実に有効です。
あとはニコニコで(C言語だけど)テトリスを実況しつつ1時間で環境構築から作るってのをぼやーっと眺めたりとかしてました。
見てみました。
「C言語で」って謳ってたんだけど、実際はC++でしたね。
ちと残念だったかも。