1. 程式人生 > >python之斐波那契青蛙跳臺階、矩陣覆蓋問題及其優化

python之斐波那契青蛙跳臺階、矩陣覆蓋問題及其優化

python之斐波那契青蛙跳臺階、矩陣覆蓋問題優化

題目描述:

(1)一隻青蛙一次可以跳上 1 級臺階,也可以跳上2 級。求該青蛙跳上一個n 級的臺階總共有多少種跳法。

(2)一隻青蛙一次可以跳上1級臺階,也可以跳上2 級……它也可以跳上n 級,此時該青蛙跳上一個n級的臺階總共有多少種跳法?

問題一,簡單分析可以得到一個斐波那契問題,解決方案有迭代和遞迴,還有在python中還可以用匿名函式,幾種實現如下:

def fib(n):
    """
    迭代斐波那契
    """
    if type(n) != int or n <= 0:
        return
    a, b = 0
, 1 for _ in range(n): a, b = b, a+b return b def fib_1(n): """ 遞迴斐波那契 """ if type(n) != int or n <= 0: return if n <= 2: return n return fib_1(n-1) + fib_1(n-2) # 匿名斐波那契 fib_2 = lambda n:n if n <=2 else fib_2(n-1)+fib_2(n-2)

遞迴用的是將中間結果壓棧的方式,所以效能相對較差,建議用迭代

類似問題(矩形覆蓋):我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?(第一塊放在邊上,可以橫著放或者豎著放,對應的方法為f(n-1)+f(n-2),所以仍為斐波那契數列問題)

問題二分析
設跳n級有f(n)種方法,
則第一步可以選擇跳1.2.3…n級,
則接下來有f(n-1).f(n-2).f(n-3)…f(1),
由此可見f(n)=f(1)+…+f(n-1)+1=2^(n-1),
求2的n-1次方

問題到此就得以解決了~

但是!光是這樣解決問題,並不是最好的解決方法。
當n很大的時候,如何解決?對於乘法如何優化?

這裡給出兩個優化思路:
1. 分治思想
2. 利用位計算代替乘除運算,以提高效率

因此,優化後的解決方案如下:

def power_2(n):
    if type(n) != int or n <= 0:
        return
    if n == 1:
        return 2
    result = power_2_2(n>>1)
    result *= result
    if 1 == n&1:
        # 判斷奇偶
        result = result<<1
    return result

此問題可以擴充套件為求任何數(整數、小數、0)的整數次方(包括0和負數)
優化方案都類似,就不再贅述了

以上為本文全部內容,歡迎指正和交流~