斐波那契数列python递归 0、1、1、2、3_python实现斐波那契数列的多种方式
正文共: 3269字 8圖
預計閱讀時間: 9分鐘
每日分享
The great pleasure in life is doing what people say you cannot do.
人生最大的快樂就是做到別人認為你做不到的事情。
小閆語錄:
當我們鼓起勇氣去做一件事情的時候,耳邊總是會有這么一個聲音『你不適合做。/你肯定不行的。/你做夢呢吧?......』各種各樣類似的打擊。它們讓我們喪失信心,甚至懷疑自己。你要明白,這個世界上最懂你的人,不是朋友,不是親戚,是你自己!你自己最有發言權。如果認定,請堅持。你要做的,就是做到他們認為你做不到的事情,不是為了向他們證明自己,而是告訴自己『我的人生我做主,我說行,不行也行!』
python實現斐波那契數列的多種方式
斐波那契數列
1,1,2,3,5,8,13,21,34,55,89,144,233,377.....這個數列就是大名鼎鼎的斐波那契數列。它被稱為黃金分割數列,在面試中也沒少碰到它。巴拉巴拉......假裝我介紹了很多,下面直接看干貨。
首先我們引入一下時間復雜度這個概念,這個是檢驗算法所耗時間的長短。檢驗代碼的質量終究還是要看算法的。因為下文中我們需要用時間復雜度衡量一下各算法的效率怎么樣,尋找一種最優方法。
上圖代表的是大量數據的增加,函數所耗費的時間怎么樣。Element元素
operations 運算,作用
Big-O Complexity Chart 大O表示法時間復雜度圖
最簡單的實現a, b= 0, 1
while b < 1000:
print(b,end=',')
a, b = b, a+b
這個就是我們在初學python時的一種寫法,隨著我們學習的深入了解,我們也用到了不同的方法實現。
函數實現
1.遞推法
首先忽略我代碼中無聊的注釋方法,哈哈哈~~~~##############################
# 使用`遞推法`實現斐波那契數列 #
#############################
def fib_next(n):
first_number = 0
second_number = 1
for _ in range(n):
first_number, second_number = second_number, first_number+second_number
return first_number
if __name__ == '__main__':
[print(fib_next(i),end=',') for i in range(1,15)]據說這種方法的時間復雜度是O(n),從圖表中對應查看,可以得知這種方法隨著數量的增加,速度會越來越慢越來越慢,顯然是不可取的。
2.遞歸法##############################
# 使用`遞歸法`實現斐波那契數列 #
#############################
def fib_recursive(n):
assert n >= 0, "n must be larger than 0"
if n <= 1:
return n
return fib_recursive(n-1) + fib_recursive(n-2)
if __name__ == '__main__':
[print(fib_recursive(i),end=',') for i in range(1,15)]這種寫法最簡單,相對來說很好理解。但是效率卻相當的低......,時間復雜度是O(1.618^n)
3.生成器##############################
# 使用`生成器`實現斐波那契數列 #
#############################
def fib_generator(max):
first_number, second_number = 0, 1
while max > 0:
first_number, second_number = second_number, first_number+second_number
max -= 1
yield first_number
if __name__ == '__main__':
[print(i,end=',') for i in fib_generator(15)]使用生成器的方法是一種不錯的想法。但是仍然不是最好的。
4.矩陣
在看下面的兩種方法之前,我們先來看一下矩陣,這是線性代數里面的一塊內容。下面簡單的解釋一下矩陣乘法:
圖中左數第一個矩陣的第一行每個元素和第二個矩陣的這一列每個元素做如下的運算:2 * 1 + 1 * 0 = 2
得到的2作為第三個矩陣的第一行第一列的元素值。同理:1 * 1 + 0 * 0 = 1
第三個矩陣的第二行第一列的元素值為1。因此兩個矩陣相乘得到第三個矩陣。
4.1第一種方法############################
# 使用`矩陣`實現斐波那契數列 #
###########################
import numpy
def fib_matrix(n):
res = pow((numpy.matrix([[1, 1], [1, 0]])), n) * numpy.matrix([[1], [0]])
return res[0][0]
if __name__ == '__main__':
[print(int(fib_matrix(i)), end=',') for i in range(10) ]因為冪運算可以使用二分加速,所以矩陣法的時間復雜度為 O(log n)
4.2第二種方法##########################
# 使用矩陣計算斐波那契數列 #
#########################
import numpy
def Fibonacci_Matrix_tool(n):
Matrix = numpy.matrix("1 1;1 0")
# 返回的是matrix類型
return pow(Matrix, n)
def Fibonacci_Matrix(n):
result_list = []
for i in range(0, n):
result_list.append(numpy.array(Fibonacci_Matrix_tool(i))[0][0])
return result_list
# 調用
if __name__ == '__main__':
a = Fibonacci_Matrix(10)
print(a)用科學計算包numpy來實現矩陣法 O(log n)
類實現
1.類#######################################
# `類內實現內部魔法方法`實現斐波那契數列 #
######################################
class Fibonacci(object):
def __init__(self, num):
self.num = num
def __iter__(self):
if self.num < 1:
return 1
first_number, second_number = 0, 1
while self.num > 0:
first_number, second_number = second_number, first_number + second_number
self.num -= 1
yield first_number
def __next__(self):
return self.__iter__()
if __name__ == '__main__':
f = Fibonacci(15)
[print(i,end=',') for i in f]參考文獻:
https://www.cnblogs.com/wj-1314/p/8490822.html
https://www.cnblogs.com/panlq/p/9307203.html
優質文章推薦:
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的斐波那契数列python递归 0、1、1、2、3_python实现斐波那契数列的多种方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统的线程和进程的区别_进程,线程,
- 下一篇: python办公代码_[Python]