交替遞迴解fibs數列 線性複雜度

2021-05-26 14:51:33 字數 1138 閱讀 8294

交替遞迴解fibs數列(線性複雜度)

(defun  fibs_help (lst)

(cons  (cons  (+ (caar lst)

(cadar lst))

(list (caar lst)))

(list (car lst))))

(defun  fibs (labela labelb)

(if  (eq  labelb  1)

'((1 1)  (1 0))

(fibs_help 

(fibs  labelb  

(1-  labelb))))) 

(defun  value (lst)

(caar lst))

(defun  fib*** (n)

(if  (eq  n  1)

1(if  (eq  n  2)

1(+  (fib***  (-  n  1))

(fib***  (-  n  2))))))

(defun  test (n)

(if  (>  n  1)

(progn 

(print (value (fibs n (1- n))))

(print  'compare)

(print (fib***  n))

(test (- n 1)))

(print 'over))) 

[42]> (test  15)

610compare

610377

compare

377233

compare

233144

compare

14489

compare

8955

compare

5534

compare

3421

compare

2113

compare138

compare85

compare53

compare32

compare21

compare

1over

over

可以看到兩者的結果是一樣的,在做壓力測試的時候比如40的時候,改進方法能很快出結果,而原來的需要很長很長的時間;

演算法精解 遞迴 尾遞迴

書上這樣說的 尾遞迴呼叫是整個函式體中最後執行的語句且它的返回值不屬於表示式的一部分時,這個遞迴呼叫就是尾遞迴。什麼意思呢,就是說我們在寫遞迴函式的時候,最後執行的語句肯定是呼叫遞迴函式,並且在呼叫過程中沒有什麼加減乘除。我們拿基本遞迴來說,如下 int fact int n 看看上面,最後執行的語...

Fibonacci數列 遞推 遞迴

無窮數列1,1,2,3,5,8,13,21,34,55,稱為fibonacci數列。它可以遞迴地定義為 第n個fibonacci數可遞迴地計算如下 int fibonacci int n 編寫完整的主函式,分別記錄利用上述遞迴函式求第45,46,47,48個fibonacci數所花費的時間。程式 p...

外觀數列 python 遞迴

外觀數列 是乙個整數序列,從數字 1 開始,序列中的每一項都是對前一項的描述。前五項如下 1 11 21 1211 111221 1 被讀作 one 1 乙個一 即 11。11 被讀作 two 1s 兩個一 即 21。21 被讀作 one 2 one 1 乙個二 乙個一 即 1211。給定乙個正整數...