フィボナッチ数列
フィボナッチ数列の第n項を返す関数。
第2回 - 結城浩のSICP日記 - sicp
Schemeを知らなくてもリンク先のプログラムは何となく読めるんではないでしょうか?>大学の友人(興味ないって?w)
今や懐かしい、直感的に書くと実行時間が掛かるヤツです。線形にしましょうってお決まりの課題ですね。
楽勝と思いながら、書こうとして少しの時間手が止まってしまいました。恥ずかしいな(笑)
gosh> (define (fib2 n) (let fib-iter ((k 1) (fk 1) (fk-1 0)) (cond ((< n k) 0 ) ((= n k) fk ) (#t (fib-iter (+ k 1) (+ fk fk-1) fk ) )))) fib2 gosh> (fib2 7) 13
(n が負のときにも 0 を返すのは蛇足ですね *1 )
named-let をなるべく使うようにしてみました(笑)>ラクダ
それにしても、結城さんの書くプログラムってすごい読みやすい。「fk-1」とかって変数名も結城さんのプログラムを真似させていただきました。
ぴったりな名前や、わかりやすいロジックでプログラムを書くことができる人に憧れます。
*1: ((< n k) 0 ) → ((= n 0) 0 ) で普通になります。ちなみに、返り値の 0 は fk-1 に置き換えた方がいいかな?