python3 生成斐波那契數(shù)列降狠,并在斐波那契數(shù)列中找出與給定數(shù)字的差值絕對(duì)值最小的元素及該差值絕對(duì)值

介紹

今天一個(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ù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末认烁,一起剝皮案震驚了整個(gè)濱河市飘弧,隨后出現(xiàn)的幾起案子识藤,更是在濱河造成了極大的恐慌,老刑警劉巖次伶,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痴昧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡冠王,警方通過(guò)查閱死者的電腦和手機(jī)赶撰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)柱彻,“玉大人豪娜,你說(shuō)我怎么就攤上這事∮纯” “怎么了瘤载?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)卖擅。 經(jīng)常有香客問(wèn)我鸣奔,道長(zhǎng),這世上最難降的妖魔是什么惩阶? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任挎狸,我火速辦了婚禮,結(jié)果婚禮上断楷,老公的妹妹穿的比我還像新娘锨匆。我一直安慰自己,他們只是感情好冬筒,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布恐锣。 她就那樣靜靜地躺著,像睡著了一般舞痰。 火紅的嫁衣襯著肌膚如雪侥蒙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天匀奏,我揣著相機(jī)與錄音,去河邊找鬼学搜。 笑死娃善,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瑞佩。 我是一名探鬼主播聚磺,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼炬丸!你這毒婦竟也來(lái)了瘫寝?” 一聲冷哼從身側(cè)響起蜒蕾,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎焕阿,沒(méi)想到半個(gè)月后咪啡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡暮屡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年撤摸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褒纲。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡准夷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出莺掠,到底是詐尸還是另有隱情衫嵌,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布彻秆,位于F島的核電站楔绞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏掖棉。R本人自食惡果不足惜墓律,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望耻讽。 院中可真熱鬧,春花似錦帕棉、人聲如沸针肥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至即纲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工稠通, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唧龄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓耽梅,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親佩番。 傳聞我的和親對(duì)象是個(gè)殘疾皇子趟畏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容