反復的プロセスからループにしてみた。
フィボナッチ数を計算する関数を、繰り返し(iteration)をつかって定義しなさい。再帰版は次の通り。
(define (fib n) (cond ((= n 1) 1) ((= n 2) 1) (else (+ (fib (- n 1))(fib (- n 2))))))
分かりませんでした。なので、関数型言語の勉強にSICPを読もう - (7) 1章 - 反復をマスターしたいけど・・・ - higepon blogをカンニングしてなぜか C で。
まず、反復プロセスだけど再帰で直訳。
int fib_sub(int a, int b, int n) { if (n==1) { return a + b; } return fib_sub(b, a + b, n - 1); } int fib(int n) { return fib_sub(1, 0, n); } int main(void) { int i; for (i=1; i<21; i++) { printf("%3d:%30d\n", i, fib(i)); } return 0; }
反復的プロセス==結局ループ だと理解してるので、fib_sub をループで書き直してみる。
int fib_sub(int a, int b, int n) { int tmp; for (; n>0; n--) { tmp = b; b += a; a = tmp; } return b; }
tmp は無くせるけどそこまでしなくても、ということで。
やるまえは、フィボナッチをループでやるなんてどうやるの?という感じでしたが、カンニングのおかげで予想以上にすっきりかけることが分かりました。
積読状態の SICP を早く再開したい…。