繁体   English   中英

试图理解递归 - 为什么我的函数达到最大递归或没有?

[英]Trying to understand recursion - Why is my function reaching maximum recursion or None?

这个问题已经被问了很多,但是在查看帖子并按照答案所说的内容之后,我不明白为什么我的代码仍然无法正常工作

所有关于递归的帖子都说您需要包含一个 return 语句来实际返回值,而不是 None。 但是当我这样做时,我会得到一个无限递归。 我有我的基本案例,以及 collat​​z 序列的其他 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
>>>

我不知道 Collat​​z 序列是什么,所以我将把它留给其他人来评论递归应该如何寻找它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM