Python編程題9--斐波那契數列


題目1

已知一個數列:1、1、2、3、5、8、13、……,其規律為從第3項開始,每一項都等於其前兩項的和,這個數列就是斐波那契數列。

請求出符合斐波那契數列規律的第11項。

代碼實現--非遞歸

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

print("斐波那契數列 第11項:{}".format(fib_show(11)))

代碼實現--遞歸

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

print("斐波那契數列 第11項:{}".format(fib_recursive(11)))

注意:遞歸方式實現起來比較簡潔,但其效率較低,不推薦。

題目2

請求出符合斐波那契數列規律的前11項。

代碼實現一

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)

代碼實現二

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("斐波那契數列 前11項:{}".format(fib_show(11)))

題目3

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

如果給定一個數N,需要讓其變為一個Fibonacci數,每一步可以把當前數字N變為N-1或者N+1,那么請求出最少需要多少步,才可以把N變為Fibonacci數。

例如:

給定一個數15,與其相鄰的兩個Fibonacci數分別為 13 和 21 ,那么這個數15要變為 13 需要兩步,變為 21 則需要六步,所以在這里最少需要兩步。

實現思路

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

代碼實現

def fib_step(num):
    a, b = 0, 1
    min_step = 0
    while True:
        # 當 b 大於輸入的數 num 時,a 就是上一次循環的 b ,此時 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 變為Fibonacci數,最少需要 {} 步".format(fib_step(15)))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM