递归函数python 3'超出最大递归深度'

时间:2017-10-08 08:33:41

标签: python python-3.x function recursion collatz

我正在学习python 3中的递归编程,如果这个问题已经重复,请原谅我。

我正在创建一个带有递归函数的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)

基本上变量x继续被传递到我定义的collat​​z函数,直到它变为1.然而,每次我运行递归函数时它会重复打印'x'然后我得到

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

我理解的是一个无限循环。我通过将它重新分配给x到第一个collat​​z()的结果,它将返回新值并继续直到它达到'1'但我似乎无法完全到达那里。

任何帮助/提示/建议都会很棒!谢谢!

3 个答案:

答案 0 :(得分:2)

递归函数具有所谓的"基本情况"什么被称为"递归案例。"基本情况是你应该停止递归并返回答案。

在这种情况下,基本情况是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

N.B。在返回新调用的结果之前,我通过x在下一个循环中更改了collatz的有效值。如果你不是,而只是return collatz(x),那么你永远不会达到基本情况并永远递归。

答案 1 :(得分:1)

@Roee Gavirel

以下是基于上述答案的最终答案:

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)

感谢您的帮助!

答案 2 :(得分:0)

您展示了相同功能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))