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 : 2y
g : 2 ^ y
h : {\underbrace{2^2^{...}^2}_{n}

#調べてみたがやっぱ違うよなあ。まあいいや

いやはやSICPだけでなく hatena も使いはじめたばかりでよくわかんね。