[英]Trying to understand recursion - Why is my function reaching maximum recursion or None?
这个问题已经被问了很多,但是在查看帖子并按照答案所说的内容之后,我不明白为什么我的代码仍然无法正常工作
所有关于递归的帖子都说您需要包含一个 return 语句来实际返回值,而不是 None。 但是当我这样做时,我会得到一个无限递归。 我有我的基本案例,以及 collatz 序列的其他 2 个案例。 我希望它打印出数字,但这是一个无限递归。
#Maximum recursion
def find_collatz_nums(number):
if number == 1:
return find_collatz_nums(number)
if number % 2 == 0:
return find_collatz_nums(number/2)
return find_collatz_nums((3 * number) + 1)
print(find_collatz_nums(3))
因此,如果我只是尝试在基本情况下进行空白返回,它将只返回无。 这是下面。
#returns None
def find_collatz_nums(number):
if number == 1:
return #will just return None.
if number % 2 == 0:
return find_collatz_nums(number/2)
return find_collatz_nums((3 * number) + 1)
print(find_collatz_nums(3))
为什么在第一个代码片段中,return 语句会导致无限递归?
我只是发现自己很困惑,因为这里有大量关于递归的帖子和回答说“你需要返回语句”,但我已经添加了它们并且代码不起作用。
如果您遵循您的 porgram 逻辑,这是函数调用的序列:
find_collatz_nums (3) ->
find_collatz_nums (10) ->
find_collatz_nums (5) ->
find_collatz_nums (16) ->
find_collatz_nums (8) ->
find_collatz_nums (4) ->
find_collatz_nums (2) ->
find_collatz_nums (1) -> find_collatz_nums (1) -> find_collatz_nums (1).... & so on
因此,您会看到 python 无法停止此调用,并且会一次又一次地调用它。 这就是为什么你需要一个基本条件才能从中返回。
我猜你想打印出序列,你可以在每次return
之前print
def find_collatz_nums(number):
if number == 1:
print(int(number))
return
if number % 2 == 0:
print(int(number), end="->")
return find_collatz_nums(number/2)
print(int(number), end="->")
return find_collatz_nums((3 * number) + 1)
find_collatz_nums(3)
# 3->10->5->16->8->4->2->1
第一个代码片段会导致您陷入无限循环,因为没有条件来逃避递归,即打印或显式返回任何内容。
您的所有分支都是递归的——即它们都再次调用该函数。 因此,您实际上没有基本案例。 基本情况是您实际上可以直接计算或返回值的情况,而不是递归计算。
考虑另一个可以用递归解决的问题:求列表中数字的总和:
基本情况是当您有空列表并且由于没有值,所以总和仅为 0。
要考虑递归情况,您可以对列表进行切片:第一项是单个数字,列表的其余部分只是另一个列表。 这种情况的总和是第一项加上列表其余部分的总和:
>>> def find_sum(values):
... if len(values) == 0:
... return 0
... else:
... return values[0] + find_sum(values[1:])
...
>>> find_sum([1, 2, 3])
6
>>>
我不知道 Collatz 序列是什么,所以我将把它留给其他人来评论递归应该如何寻找它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.