此代碼導致RecursionError: maximum recursion depth exceeded while calling a Python object. 我知道回圈很容易使用,但是有沒有辦法在不增加遞回限制的情況下使用遞回來實作它?尾呼叫優化是一種方法?還有其他方法嗎?
def print_recursion(m,n):
if m==n:
return
else:
print_recursion(m 1,n)
print_recursion(1,1000000)
uj5u.com熱心網友回復:
您可以使用分而治之的策略。將問題視為二叉樹的按順序遍歷,其中概念上每個節點都包含一個范圍。根包含整個范圍,每個后代節點包含其父節點的一半。當范圍的 lower_limit 等于 upper_limit 時列印當前值。否則,計算范圍的中點并對子范圍 (lower_limit, midpoint) 和 (midpoint 1, upper_limit) 進行兩次遞回呼叫。這在遞回的每個級別將問題減半,因此遞回堆疊大小為 O(log(N)),其中 N 是原始范圍長度。對于 1_000_000 的范圍,樹的高度為 20。
代碼是:
def print_recursion(lower_limit, upper_limit):
if lower_limit == upper_limit:
print(lower_limit)
else:
midpoint = lower_limit (upper_limit - lower_limit) // 2
print_recursion(lower_limit, midpoint)
print_recursion(midpoint 1, upper_limit)
print_recursion(1, 1000000)
我用較小的范圍對其進行了測驗,以確認它可以正常作業,然后對整個范圍進行計時:
% time python3 rec.py | wc
1000000 1000000 6888896
python3 rec.py 0.32s user 0.01s system 95% cpu 0.343 total
wc 0.01s user 0.00s system 4% cpu 0.333 total
%
如您所見,Python 部分的運行時間約為 1/3 秒。這是在 M1 MacBook Pro 上使用 Python 3.10.8。字數 ( wc) 確認有一百萬行。
在實踐中,您應該像 Samwise 在他們的評論中所說的那樣使用回圈來執行此操作,但是如果您堅持遞回并且正在處理大范圍,那么在我看來,這種方法很簡單,可讀且可維護。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/520646.html
標籤:Python递归
