2017-06-17 75 views
0

我已經做了一個程序,返回一個斐波那契數列使用尾遞歸,我想將其結果添加到列表中。我也做了以下內容:如何追加計劃中的列表中的元素

(define listAux '()) 
(define (fibTail n1 n2 c) 
    (if (= c 0) 
     (appendList -1) 
     (begin 
     (appendList n2) 
     (fibT (+ n1 n2) n1 (- c 1)) 
     ))) 

(define (appendList n) 
    (if (= n -1) 
     listAux 
     (append (list n) listAux))) 


(define (fib n) 
    (fibTail 1 0 n)) 

我想這appendList返回與斐波納契數列的元素的列表,當我這樣稱呼它(FIB 8)爲例。 有什麼幫助嗎? 感謝

回答

1

當Lisp程序,我們避免使用append建設名單 - 這是非常低效的,因爲在末尾插入一個元素,我們不得不遍歷整個列表...,然後又一次,又一次。最好使用cons以相反順序構建列表,並在最後反轉。此外,編寫尾遞歸的理想方式是將結果累積到一個參數中,而不是在外部定義的變量中(否則它將不起作用,除非其值爲某處)。這就是我的意思是:

(define (fib n) 
    (fibTail 1 0 n '())) 

(define (fibTail n1 n2 c lst) 
    (if (< c 0) 
     (reverse lst) 
     (fibTail (+ n1 n2) n1 (- c 1) (cons n2 lst)))) 

例如:

(fib 10) 
=> '(0 1 1 2 3 5 8 13 21 34 55)