簡體   English   中英

爬樓梯 python - 大數字

[英]Climbing stairs python - big numbers

這段代碼應該做的是你必須爬上“n”步的樓梯。 在每一步,您都可以爬“1”或“2”級台階。 此代碼適用於小數字但不適用於大數字,例如 print(climbing_stairs(45)) 將不起作用。 C中有long和double long,想知道python中有沒有類似的。

    def climbing_stairs(n):
            if ( n == 0 ):
                    return 1
                elif (n < 0):
                    return 0
             
                else:
                    return climbing_stairs(n - 2) + climbing_stairs(n - 1)
        
print(climbing_stairs(2))
print(climbing_stairs(3))
print(climbing_stairs(45))

當前代碼的問題是運行時的復雜性。 此代碼在O(2^n)中運行,並且對於更大的數字是不可行的。

這個問題只是斐波那契數列的改寫。 你目前正在做的是反復重新計算相似的結果。 比如說,您知道有多少種方法可以從第 4 步移動到n 當你不記憶它時,你將在下次重新計算它,因為有不同的方法可以到達第 4 步。

dp = {}
def climbing_stairs(n):
    if n == 0 or n == 1:
        return 1
    elif n < 0:
        return 0
    elif n in dp:
        return dp[n]
    else:
        dp[n] = climbing_stairs(n - 2) + climbing_stairs(n - 1)
        return dp[n]

以更pythonic的方式:

from functools import cache

@cache
def climbing_stairs(n):
    if n == 0 or n == 1:
        return 1
    elif n < 0:
        return 0
    else:
        return climbing_stairs(n - 2) + climbing_stairs(n - 1)

對於這個具有恆定時間復雜度的問題,還有一種優雅的迭代方法:

def climbing_stairs(n):
    if n < 3: return n
    
    first, second = 1, 2
    for _ in range(1, n):
        third = first+second
        first, second = second, third
    
    return second

記憶遞歸版本和迭代版本都具有線性運行時復雜度,因為我們只計算每個步驟一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM