交替遞迴解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。給定乙個正整數...