CommonLisp Scheme Part10at TECH
CommonLisp Scheme Part10 - 暇つぶし2ch565:デフォルトの名無しさん
04/06/09 14:50
fibonacci 数列について質問です。
これを関数型の記述のまま、計算量を減らすことはできないでしょうか?


まず、定義どおりに関数型で記述してみました。
(define (fib x)
 (if (< x 2)
   1
   (+ (fib (- x 1)) (fib (- x 2)))))

これだと、定義がそのままコードになっていて、とてもわかりやすいのですが、
x の小さな項を何度も計算しなおすので、x が大きくなると計算量が膨れ
上がってしまいます。
Chez Scheme では x=35 ぐらいが限界でした。


手続き型で、小さい項をまず求めて、それをもとに大きな項を求めるように書くと、
計算量がはるかに少なくて済むのですが、わかりづらくなります。
定義がそのままコードになっている、関数型の記述とはだいぶ違います。
(define (fib2 n)
 (if (< n 2)
   1
   (do ((x1 1 (+ x1 x0))
      (x0 1 x1)
      (m 2 (+ m 1)))
     ((<= n m) (+ x1 x0)))))


次ページ
続きを表示
1を表示
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch