2012-03-07 9 views
3

私はどのような長さ "n"でもフィボナッチシーケンスを出力する基本的なプログラムを作った。Schemeでフィボナッチ数のリストを作成していますか?

(define (fibh n) 
    (if (< n 2) 
     n 
     (+ (fibh (- n 1)) (fibh (- n 2))))) 

(define (fib n) 
    (do ((i 1 (+ i 1))) 
     ((> i n)) 
    (display (fibh i)))) 

それが出力、例えば、112358: は、ここで私が持っているコードです。

私が欲しいのは、(1 1 2 3 5 8)のようなリストです。

これを行う方法については、大変ご了承ください。

答えて

6
(map fibh '(1 2 3 4 5 6)) 

はトリックを行います。

(define (count i n) 
    (if (= i n) 
    '() 
    (cons i (count (+ i 1) n)))) 

(注:これは末尾再帰ではありませんが、そのアルゴリズムを持つにあなたが手で整数を列挙したくない場合は、のように、あなたのためにそれを行うだろう、単純な再帰関数を実装フィボナッチ数を計算してください、それはあなたの主要な関心事ではありません)。

+0

そこで試してみて、それは魅力的でした。どうもありがとうございます。 – Phil

2
Petite Chez Scheme Version 8.3 
Copyright (c) 1985-2011 Cadence Research Systems 

> (define (fib n) 
    (let loop ((n n) (f2 1) (f1 1) (fs (list))) 
     (if (zero? n) (reverse fs) 
     (loop (- n 1) f1 (+ f2 f1) (cons f2 fs))))) 
> (fib 50) 
(1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 
4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 
514229 832040 1346269 2178309 3524578 5702887 9227465 
14930352 24157817 39088169 63245986 102334155 165580141 
267914296 433494437 701408733 1134903170 1836311903 
2971215073 4807526976 7778742049 12586269025) 
関連する問題