簡體   English   中英

遞歸函數python 3'超出最大遞歸深度'

[英]recursive function python 3 'maximum recursion depth exceeded'

我正在使用下面的遞歸函數創建collat​​z序列:

def collatz(n):
  if n%2 == 0:
    return int(n/2)
  else:   
    return int((3 * n)/2)

據我了解,遞歸函數是一個基本上可以自我調用的函數。 下面,我嘗試使用以下方法創建遞歸函數:

def collatz(x):
    if x == 1:
        "Done"
    print(x)
    x = collatz(x)
    return(x)

從本質collatz ,變量x繼續傳遞到我定義的collatz函數中,直到達到1。但是,每次我運行遞歸函數時,它都會重復打印'x' ,然后得到

collatz(3)    
'RecursionError: maximum recursion depth exceeded in comparison' 

我理解的本質上是一個無限循環。 我以為通過將其重新分配給x到第一個collatz()的結果中,它將返回新值並繼續直到其達到'1'但我似乎不太能到達那里。

任何幫助/提示/建議都將非常棒! 謝謝!

遞歸函數具有所謂的“基本案例”和所謂的“遞歸案例”。 基本情況是您應該停止遞歸並返回答案。

在這種情況下,基本情況是x==1

def collatz(x):
    if x == 1:
        return x

而遞歸的情況是剩下的時間

# continuing from above
    else:
        if n % 2 == 0:
            return collatz(int(n//2))
        else:
            return collatz(n*3 / 2)  # sicut. Note that the collatz sequence
                                     # uses 3n+1 here, not 3n/2 as in the question

注意,在返回新調用的結果之前,我通過collatz在下一個循環中更改了xcollatz 如果不這樣做,只需return collatz(x) ,就永遠不會達到基本情況並永遠遞歸。

@羅伊·加維雷爾

這是根據他的上述回答得出的最終答案:

def collatz(x):
    if x == 1:
        "Done"
    elif x%2 == 0:
        x = int(x/2)
        print(x)
        collatz(x)     
    else:
        x = int((3*x)+1)
        print(x)
        collatz(x)


collatz(3)

感謝您的所有幫助!

您需要展示同一功能collat​​z的兩種不同實現,同時需要將它們組合在一起。

def collatz(n):
    if x == 1:
        "Done"
    print(x)
    if n%2 == 0:
        collatz(int(n/2))
    else:   
        collatz(int((3 * n)/2))

暫無
暫無

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

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