關於斐波那契數列的一點小結

2022-05-14 10:54:02 字數 1514 閱讀 1035

斐波那契數列就是0,1,1,2,3,5……這樣的一波數列,第三個數是前兩個數的和。

兔子問題,上樓梯的台階方法的個數問題,都是斐波那契數列。

斐波那契可以簡單的用遞迴實現:

1

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

簡單有效,但是在n很大的時候時間長。

也可以用迭代來實現

1

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

時間複雜度o(n),空間複雜度o(1),就是兩個變數a,b。

還有矩陣的方法

根據如下遞推公式

可以求得,只需要計算矩陣[[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 ...