介紹
今天一個(gè)同事問(wèn)如何使用python在斐波那契數(shù)列中找出與給定數(shù)字的差值絕對(duì)值最小的元素对竣,我試著寫了一下,解決了問(wèn)題榜配,現(xiàn)在分享出來(lái)供需要的同學(xué)參考否纬。
1、什么是斐波那契數(shù)列
以下內(nèi)容摘錄自斐波那契數(shù)列的百度百科
斐波那契數(shù)列(Fibonacci sequence)蛋褥,又稱黃金分割數(shù)列临燃、因數(shù)學(xué)家萊昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數(shù)列”,指的是這樣一個(gè)數(shù)列:0膜廊、1乏沸、1、2爪瓜、3蹬跃、5、8铆铆、13蝶缀、21、34算灸、……在數(shù)學(xué)上扼劈,斐波那契數(shù)列以如下被以遞推的方法定義:F(0)=0,F(xiàn)(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3菲驴,n ∈ N*)
2荐吵、首先生成斐波那契數(shù)列(指定長(zhǎng)度生成)
根據(jù)上面的定義可以知道如何獲取一串斐波那契數(shù)列,python中實(shí)現(xiàn)的方式也很多赊瞬,下面使用一種簡(jiǎn)單的方式實(shí)現(xiàn)
# 生成長(zhǎng)度為n的斐波那契數(shù)列
def getFibonacci(n):
if not isinstance(n, int) or n < 3:
return '參數(shù)n必須為大于等于3的正整數(shù)'
a, b = 0, 1
fibList = []
i = 0
while i < n:
fibList.append(a)
a, b = b, a+b
i += 1
return fibList
調(diào)試
if __name__ == '__main__':
print('結(jié)果1:', getFibonacci(2))
print('結(jié)果2:', getFibonacci(10))
print('結(jié)果3:', getFibonacci(30))
結(jié)果1: 參數(shù)n必須為大于等于3的正整數(shù)
結(jié)果2: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
結(jié)果3: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229]
說(shuō)明:從上面可以看出來(lái)先煎,數(shù)字會(huì)隨著長(zhǎng)度n原來(lái)越大,n=100時(shí)巧涧,最后一個(gè)為218922995834555169026薯蝎,因此在使用的時(shí)候,如果不是特別需要谤绳,建議n不要過(guò)大占锯。
3、在斐波那契數(shù)列中找出與給定數(shù)字的差值絕對(duì)值最小的元素及該差值絕對(duì)值
說(shuō)明:下面getMinDiffValue()函數(shù)的正常返回值為一個(gè)兩元素字典缩筛,第一個(gè)元素為與目標(biāo)數(shù)字差值絕對(duì)值最小的數(shù)列元素消略,第二個(gè)為最小的差值絕對(duì)值
# 獲取給定數(shù)字m與斐波那契數(shù)列元素的差值絕對(duì)值最小的元素及差值絕對(duì)值
def getMinDiffValue(targetFib, m):
# targetFib 目標(biāo)斐波那契數(shù)列
# m 目標(biāo)數(shù)字
try:
# 如果數(shù)字小于等于0,則最小的元素一定是0瞎抛,差值絕對(duì)值為abs(m)
if m <= 0:
return {'與 %s 的差值絕對(duì)值最小的數(shù)列元素'%(str(m), ):0, '最小差值絕對(duì)值':abs(m)}
diffValueList = []
closeFibNumList = []
for i in range(0, len(targetFib)):
# 處理目標(biāo)數(shù)字在斐波那契數(shù)列中存在時(shí)的情況
if targetFib[i] == m:
return {'與 %s 的差值絕對(duì)值最小的數(shù)列元素'%(str(m), ):m, '最小差值絕對(duì)值':0}
# 處理目標(biāo)數(shù)字在斐波那契數(shù)列中不存在時(shí)的情況
if targetFib[i] > m:
# 獲取最小的差值絕對(duì)值
closeFibNumList.append(targetFib[i - 1])
closeFibNumList.append(targetFib[i])
diffValueList.append(targetFib[i] - m)
diffValueList.append(m - targetFib[i - 1])
minDiffValue = min(diffValueList)
# 獲取差值絕對(duì)值最小的元素
temAvg = sum(closeFibNumList) / 2
if m < temAvg:
targetItem = targetFib[i - 1]
elif m == temAvg:
targetItem = closeFibNumList
else:
targetItem = targetFib[i]
return {'與 %s 的差值絕對(duì)值最小的數(shù)列元素'%(str(m), ): targetItem, '最小差值絕對(duì)值': minDiffValue}
# 給定的斐波那契數(shù)列長(zhǎng)度不足時(shí)給出提示
return '目標(biāo)數(shù)字大于給定的斐波那契數(shù)列最后一位數(shù)字艺演,長(zhǎng)度不足,請(qǐng)修改斐波那契數(shù)列的長(zhǎng)度'
except:
return '處理過(guò)程遇到異常桐臊,請(qǐng)確認(rèn)傳參正確:第一個(gè)參數(shù)為純數(shù)字列表(要求為斐波那契數(shù)列)胎撤,第二個(gè)參數(shù)為實(shí)數(shù)'
調(diào)試
if __name__ == '__main__':
print('目標(biāo)斐波那契數(shù)列為:', fib)
print('結(jié)果1:',getMinDiffValue(fib, -27))
print('結(jié)果2:',getMinDiffValue(fib, 0))
print('結(jié)果3:',getMinDiffValue(fib, 8))
print('結(jié)果4:',getMinDiffValue(fib, 17))
print('結(jié)果5:',getMinDiffValue(fib, 27))
print('結(jié)果6:',getMinDiffValue(fib, 35))
print('結(jié)果7:',getMinDiffValue(fib, '3test'))
結(jié)果
目標(biāo)斐波那契數(shù)列為: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
結(jié)果1: {'與 -27 的差值絕對(duì)值最小的數(shù)列元素': 0, '最小差值絕對(duì)值': 27}
結(jié)果2: {'與 0 的差值絕對(duì)值最小的數(shù)列元素': 0, '最小差值絕對(duì)值': 0}
結(jié)果3: {'與 8 的差值絕對(duì)值最小的數(shù)列元素': 8, '最小差值絕對(duì)值': 0}
結(jié)果4: {'與 17 的差值絕對(duì)值最小的數(shù)列元素': [13, 21], '最小差值絕對(duì)值': 4}
結(jié)果5: {'與 27 的差值絕對(duì)值最小的數(shù)列元素': 21, '最小差值絕對(duì)值': 6}
結(jié)果6: 目標(biāo)數(shù)字大于給定的斐波那契數(shù)列最后一位數(shù)字,長(zhǎng)度不足断凶,請(qǐng)修改斐波那契數(shù)列的長(zhǎng)度
結(jié)果7: 處理過(guò)程遇到異常伤提,請(qǐng)確認(rèn)傳參正確:第一個(gè)參數(shù)為純數(shù)字列表(要求為斐波那契數(shù)列),第二個(gè)參數(shù)為實(shí)數(shù)