- 565 名前:デフォルトの名無しさん [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)))))
|

|