定義
斐波那契數(shù)列(Fibonacci sequence),又稱(chēng)黃金分割數(shù)列筝闹、
因數(shù)學(xué)家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子
(假定每對(duì)大兔每月能生產(chǎn)一對(duì)小兔汗贫,而每對(duì)小兔生長(zhǎng)兩個(gè)月就成為大兔澈圈,一年后可以繁殖成多少對(duì)兔子?)
而引入域携,故又稱(chēng)為“兔子數(shù)列”棺弊。
指的是這樣一個(gè)數(shù)列:1晶密、2、3模她、5稻艰、8、13侈净、21尊勿、34僧凤、……
在數(shù)學(xué)上,斐波納契數(shù)列以如下被以遞歸的方法定義:F(1)=1元扔,F(xiàn)(2)=2, F(n)=F(n-1)+F(n-2)(n>2躯保,n∈N*)
在現(xiàn)代物理、準(zhǔn)晶體結(jié)構(gòu)澎语、化學(xué)等領(lǐng)域途事,斐波納契數(shù)列都有直接的應(yīng)用,
為此擅羞,美國(guó)數(shù)學(xué)會(huì)從1963起出版了以《斐波納契數(shù)列季刊》為名的一份數(shù)學(xué)雜志尸变,
用于專(zhuān)門(mén)刊載這方面的研究成果。
python代碼
廢話不說(shuō)减俏,直接上代碼
# -*- coding: utf-8 -*-
def fib(max):
# 默認(rèn)input是str類(lèi)型
max = int(max)
n,a,b = 1,0,1
# max:求幾個(gè)斐波那契數(shù)
while(n <= max):
print(b)
# 這一步很關(guān)鍵 f(n) = f(n-1) + f(n-2)
# 1 1 2 3 5 8
t = (b,a+b)
a = t[0]
b = t[1]
n += 1
return 'done'
print('求斐波那契前N個(gè)數(shù)召烂?請(qǐng)輸入N:')
max = input()
fib(max)
賦值語(yǔ)句簡(jiǎn)化
其中
t = (b,a+b)
a = t[0]
b = t[1]
可以簡(jiǎn)化為:
a,b = b,a+b
改進(jìn)后的完整代碼為:
# -*- coding: utf-8 -*-
def fib(max):
# 默認(rèn)input是str類(lèi)型
max = int(max)
n,a,b = 1,0,1
# max:求幾個(gè)斐波那契數(shù)
while(n <= max):
print(b)
# 這一步很關(guān)鍵 f(n) = f(n-1) + f(n-2)
# 1 1 2 3 5 8
a,b = b,a+b
n += 1
return 'done'
print('求斐波那契前N個(gè)數(shù)?請(qǐng)輸入N:')
max = input()
fib(max)
使用生成器進(jìn)行改造
上面的函數(shù)和generator僅一步之遙垄懂。要把fib
函數(shù)變成generator
骑晶,只需要把print(b)
改為yield b
就可以了
# -*- coding: utf-8 -*-
def fib(max):
# 默認(rèn)input是str類(lèi)型
max = int(max)
n,a,b = 1,0,1
# max:求幾個(gè)斐波那契數(shù)
while(n <= max):
yield b
# 這一步很關(guān)鍵 f(n) = f(n-1) + f(n-2)
# 1 1 2 3 5 8
a,b = b,a+b
n += 1
return 'done'
print('求斐波那契前N個(gè)數(shù)?請(qǐng)輸入N:')
max = input()
g = fib(max)
print('使用python生成器獲取斐波那契前%s個(gè)數(shù):' %max)
for n in g:
print(n)