簡體   English   中英

python中超過了最大遞歸深度

[英]Maximum recursion depth exceeded in python

我試圖通過遞歸使冪函數。 但是我遇到了運行時錯誤,例如超出了最大遞歸深度。 我將不勝感激! 這是我的代碼。

 def fast_power(a,n):
    if(n==0):
        return 1
    else:
       if(n%2==0):
           return fast_power(fast_power(a,n/2),2)
       else:
           return fast_power(fast_power(a,n/2),2)*a

您應該使用n // 2而不是n / 2

>>> 5 // 2
2
>>> 5 / 2
2.5

(至少在python3中)

問題是,一旦您最終獲得浮點數,則需要花費相當長的時間才能最終將其除以2等於0

>>> from itertools import count
>>> n = 5
>>> for i in count():
...     n /= 2
...     if n == 0:
...         break
... 
>>> i
1076

因此,如您所見,您將需要進行1000多次遞歸調用才能從5達到0 ,並且這超過了默認遞歸限制。 此外:該算法應與整數一起運行。


這就是說我會將該函數編寫為:

def fast_power(a, n):
    if n == 0:
        return 1
    tmp = fast_power(a, n//2)
    tmp *= tmp
    return a*tmp if n%2 else tmp

產生:

>>> fast_power(2, 7)
128
>>> fast_power(3, 7)
2187
>>> fast_power(13, 793)
22755080661651301134628922146701289018723006552429644877562239367125245900453849234455323305726135714456994505688015462580473825073733493280791059868764599730367896428134533515091867511617127882942739592792838327544860344501784014930389049910558877662640122357152582905314163703803827192606896583114428235695115603966134132126414026659477774724471137498587452807465366378927445362356200526278861707511302663034996964296170951925219431414726359869227380059895627848341129113432175217372073248096983111394024987891966713095153672274972773169033889294808595643958156933979639791684384157282173718024930353085371267915606772545626201802945545406048262062221518066352534122215300640672237064641040065334712571485001684857748001990405649808379706945473443683240715198330842716984731885709953720968428395490414067791229792734370523603401019458798402338043728152982948501103056283713360751853

我相信@Bakuriu對問題的解釋不完整。 不是他的重新實現,而是他對您的錯誤的解釋。 你可能會通過更換說服這個自己///你的原代碼和嘗試:

fast_power(2, 2)

它仍然超過堆棧。 嘗試將堆棧擴展十倍:

sys.setrecursionlimit(10000)

它仍然超過堆棧。 原因是您還有一個無限循環:

if (n % 2 == 0):
    return fast_power(..., 2)

由於2%2 == 0,因此這將永遠保持遞歸。 添加另一個基本案例:

if n == 2:
    return a * a

解決問題。 完整的解決方案:

def fast_power(a, n):
    if n == 0:
        return 1

#   if n == 1:
#       return a

    if n == 2:
        return a * a

    if n % 2 == 0:
        return fast_power(fast_power(a, n // 2), 2)

    return a * fast_power(fast_power(a, n // 2), 2)

暫無
暫無

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

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