斐波那契數列就是0,1,1,2,3,5……這樣的一波數列,第三個數是前兩個數的和。
兔子問題,上樓梯的台階方法的個數問題,都是斐波那契數列。
斐波那契可以簡單的用遞迴實現:
1簡單有效,但是在n很大的時候時間長。def fib(n)
2# calculate the nth fibonacci number
3return n if n == 0 || n == 1
4return fib(n-1) + fib(n-2
) 5 end
也可以用迭代來實現
1時間複雜度o(n),空間複雜度o(1),就是兩個變數a,b。deffib(n)
2return n if n == 0 || n == 1
3 a, b = 0, 1
4 until n == 1
5 b = a +b
6 a = b -a
7 n -= 1
8end9b
10 end
還有矩陣的方法
根據如下遞推公式
可以求得,只需要計算矩陣[[1,1],[1,0]]的n次方即可,這個計算的時間複雜度是o(logn)
1 require '這些都是網上可以找到的方法。matrix'2
deffib(n)
3 mat = matrix[[1,1],[1,0]]
4return n if n == 0 || n == 1
5return mat_n(mat,n-1).first
6end78
defmat_n(ma1,n)#計算矩陣的n次方
9return ma1 if n == 1
10 n.even? ? mat_n(ma1,n/2)**2 : ma1*mat_n(ma1,n-1)
11 end
還有一種迭代的方法,複雜度也是o(logn)。
具體內容如下:
其思想也是將兩次迭代表示成一次迭代,這樣n次迭代就只有o(logn)的時間就可以完成了。
另外,以上討論的都是正數的情況,如果斐波那契數列的引數是負數呢?
由f(n+2) = f(n+1) + f(n),可以知道f(n) = f(n+2) - f(n+1),因此負數的斐波那契數列也是存在的。
遞迴方法可以直接得到,迭代方法也可以直接應用,這個矩陣方法就有點麻煩了,直接找比較難找出這個矩陣,可以先看一下負數的序列,
f(-1) = f(1)-f(0) = 1 ,f(-2) = -1 ,f(-3) = 2, f(-4) = -3,f(-5) = 5……
0 1 1 2 3 5 8 ……
0 1 -1 2 -3 5 -8 ……
找到規律了,在引數小於0的時候,斐波那契數列是一正一負分布的,而且和引數大於0恰好對應。哈哈,是不是很巧?
於是,計算的時候只要在引數為正數的情況下考慮奇偶就行了。
斐波那契數列小結
斐波那契數列,又稱 分割數列,指的是這樣乙個數列 1 1 2 3 5 8 13 21 在數學上,斐波納契數列以如下被以遞迴的方法定義 f0 0,f1 1,fn f n 1 f n 2 n 2,n n public static void main string args system.out.pri...
關於斐波那契數列
斐波那契數列是一種非常有意思的數列,由 00 0 和 11 1 開始,之後的斐波那契係數就由之前的兩數相加。用數學公式定義斐波那契數列則可以看成如下形式 f0 0f 0 0f0 0f1 1f 1 1f1 1fn fn 1 fn 2f n f f fn fn 1 fn 2 我們約定 fnf nfn 表...
斐波那契數列 斐波那契數列python實現
斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞推的方法定義 f 1 ...