我正在学习python 3中的递归编程,如果这个问题已经重复,请原谅我。
我正在创建一个带有递归函数的collatz序列:
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继续被传递到我定义的collatz函数,直到它变为1.然而,每次我运行递归函数时它会重复打印'x'然后我得到
collatz(3)
'RecursionError: maximum recursion depth exceeded in comparison'
我理解的是一个无限循环。我通过将它重新分配给x到第一个collatz()的结果,它将返回新值并继续直到它达到'1'但我似乎无法完全到达那里。
任何帮助/提示/建议都会很棒!谢谢!
答案 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)
您展示了相同功能collatz的两种不同实现,而您需要将它们组合在一起。
def collatz(n):
if x == 1:
"Done"
print(x)
if n%2 == 0:
collatz(int(n/2))
else:
collatz(int((3 * n)/2))