[英]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.