我制作了一個程式,它通過呼叫函式來輸出數字的階乘:factorial(),它使用遞回來計算并回傳值。當用戶輸入單詞“off”時,我還包括一個回圈來中斷程式。請提出任何改進建議
這是代碼:
def factorial(base):
if base == 0 or base == 1:
return 1
else:
return base * factorial(base - 1)
while True:
base: int = int(input("Enter a base number: "))
Result = factorial(base)
print(f"The factorial of {base} is: {Result}")
offf: str = input("Enter 'off' to terminate calculations: ")
if offf == "off":
print("Calculations Terminated")
break
這是終端:

uj5u.com熱心網友回復:
雖然遞回方法似乎是一件很自然的事情,但遺憾的是這不是很有效,因為每個呼叫都需要創建一個單獨的堆疊框架。由于 Python 的遞回深度限制,它也會導致問題,這意味著您該程式將引發任何base> 1000 的例外。迭代方法(帶回圈)大約快 2-3 倍,并避免了遞回限制問題。
def factorial_iterative(base, acc = 1):
acc = 1
for i in range(1, base 1):
acc *= i
return acc
編輯:當然,這仍然比不上 Python 內置的math.factorial方法,它給我們帶來了接近 10 倍的加速。
以下是函式呼叫 base = 995 和 20000 的結果:
- 遞回:12.80487060546875 秒
- 迭代:6.284244060516357 秒
math.factorial: 1.1593496799468994 秒
uj5u.com熱心網友回復:
你也可以試試這個可以記住階乘的東西
res_store = [1]
def factorial(num):
try:
return num * res_store[num-1]
except IndexError:
for i in range(len(res_store), num 1):
res_store.append(i * res_store[i-1])
return num * res_store[num-1]
性能方面它會非常快,但它會將結果存盤在串列中,因此會占用記憶體。對于階乘 3000 -> 大小消耗將是 26040 位元組。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/520606.html
