1.2 Procedure and the Process They generate
ここまではlanguage features、というか道具の仕組についての解説中心だったが、ここからは道具の使い方、パターンの説明にいよいよ入っていくようです。別段Lispを教えたい本ではなく、複雑な問題を切り分ける術、というのを教えたい本なんだそうなので、ここから本番、なわけか。
最初のパターンが次、、、
1.2.1 Linear Recursion and Iteraction
実はちょっと先に進んで1.3の高階関数をちらっと見てきたのですが、あんまりLisp慣れてないものだから、Ex.30のIterative Processに書き換えろ問題で悩んでしまってました。ここを読めば一発だったのね。
と言うわけで、n!(階乗)を
- n! = n x (n-1)! -> linear recursive process
- n! = 1 x 2 x ... x n -> linear iterative process
のどっちで考えるかで 2つのパターンに分けられる、というところですね。
今までCとかばっかだったので書き方新鮮。recursion で書いても iterative になるのか。他の資料(shiroさんのページ)をあたると、効率も良いようです。
勉強になるなあ…
なんでも再帰
http://www.shiro.dreamhost.com/scheme/docs/tailcall-j.html
step | memory | |
---|---|---|
recursive | O(n) | O(n) |
iterative | O(n) | O(1) |
Schemeにも do があることは知ってたのですが、あれってSyntax sugarだったのね。。。いろいろ勉強になるなあ(そればっか)
Ex.1.9
足し算ですな。
上の再帰版が
(inc (inc .... [n回] .. b))..)
のようになって
下のループ版が
(+ a b) -> (+ a-1 b+1) -....-> (+ 0 a+b)
と変形していってどちらも a+b になる、と。簡単。
Ex.1.10
アッカーマン関数ってこんなんだっけ?
とりあえずこれに従うと
f :
g :
h :
#調べてみたがやっぱ違うよなあ。まあいいや
いやはやSICPだけでなく hatena も使いはじめたばかりでよくわかんね。