Python編程題9--斐波那契數(shù)列

題目1

已知一個(gè)數(shù)列:1、1、2、3、5、8、13、……,其規(guī)律為從第3項(xiàng)開始,每一項(xiàng)都等于其前兩項(xiàng)的和,這個(gè)數(shù)列就是斐波那契數(shù)列。

請(qǐng)求出符合斐波那契數(shù)列規(guī)律的第11項(xiàng)。

代碼實(shí)現(xiàn)--非遞歸

def fib_show(n):
    a, b = 0, 1
    while n > 0:
        a, b = b, a + b
        n -= 1
    return a

print("斐波那契數(shù)列 第11項(xiàng):{}".format(fib_show(11)))

代碼實(shí)現(xiàn)--遞歸

def fib_recursive(n):
    if n == 1 or n == 2:
        return 1
    return fib_recursive(n - 1) + fib_recursive(n - 2)

print("斐波那契數(shù)列 第11項(xiàng):{}".format(fib_recursive(11)))

注意:遞歸方式實(shí)現(xiàn)起來(lái)比較簡(jiǎn)潔,但其效率較低,不推薦。

題目2

請(qǐng)求出符合斐波那契數(shù)列規(guī)律的前11項(xiàng)。

代碼實(shí)現(xiàn)一

def fib_show(n):
    a, b = 0, 1
    while n > 0:
        if n == 1:
            print(b)
        else:
            print(b, end=", ")
        a, b = b, a + b
        n -= 1

fib_show(11)

代碼實(shí)現(xiàn)二

def fib_show(n):
    if n == 1:
        return "1"
    if n == 2:
        return "1, 1"
    res = [1, 1]
    for i in range(2, n):
        res.append(res[-1] + res[-2])
    return ", ".join([str(i) for i in res])

print("斐波那契數(shù)列 前11項(xiàng):{}".format(fib_show(11)))

題目3

對(duì)于斐波那契數(shù)列:1、1、2、3、5、8、13、……。我們把其數(shù)列中的數(shù)稱為斐波那契數(shù)(Fibonacci數(shù))。

如果給定一個(gè)數(shù)N,需要讓其變?yōu)橐粋€(gè)Fibonacci數(shù),每一步可以把當(dāng)前數(shù)字N變?yōu)镹-1或者N+1,那么請(qǐng)求出最少需要多少步,才可以把N變?yōu)镕ibonacci數(shù)。

例如:

給定一個(gè)數(shù)15,與其相鄰的兩個(gè)Fibonacci數(shù)分別為 13 和 21 ,那么這個(gè)數(shù)15要變?yōu)?13 需要兩步,變?yōu)?21 則需要六步,所以在這里最少需要兩步。

實(shí)現(xiàn)思路

  • 分別求出與所指定數(shù)相鄰的兩個(gè)Fibonacci數(shù):a 和 b
  • 分別求出所指定數(shù)與 a 和 b 的距離步數(shù) left_step 和 right_step
  • 對(duì)比 left_step 和 right_step,數(shù)值最小的即為所需的最小步數(shù)

代碼實(shí)現(xiàn)

def fib_step(num):
    a, b = 0, 1
    min_step = 0
    while True:
        # 當(dāng) b 大于輸入的數(shù) num 時(shí),a 就是上一次循環(huán)的 b ,此時(shí) a 肯定小于 num
        if num >= a and num <= b:
            left_step = num - a
            right_step = b - num
            if left_step < right_step:
                min_step = left_step
            else:
                min_step = right_step
            break
        a, b = b, a + b
    return min_step

print("如果把 15 變?yōu)镕ibonacci數(shù),最少需要 {} 步".format(fib_step(15)))

更多Python編程題,等你來(lái)挑戰(zhàn):Python編程題匯總(持續(xù)更新中……)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容