如果不使用return,函数是否仍然是递归的?

2024-04-26 21:35:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了以下代码,用于计算斐波那契序列:

arr = [0]
i = 1
def get_fib(position):
    if position == 0:
        return arr[0]

    if position > 0:
        global i
        arr.append(i)
        i = i + arr[-2]

        get_fib(position - 1)

    return arr[position]

即使我在getfib之前不使用return,这仍然是递归吗? 对于递归函数,是否需要包含return?你知道吗


Tags: 代码getreturnifdefposition序列global
3条回答

是的,根据定义,这个函数是递归的,因为它调用自己。调用return的位置并不是决定函数是否递归的因素。但是,如果您编写递归函数,它必须在某个点返回(称为“基本情况”),因为如果不返回,它将导致无限递归,一旦您传递Python解释器的max recursion limit,它将抛出一个异常(“运行时错误:超过最大递归深度”)。你知道吗

举两个例子:
示例1:

>>> def fun_a():
...     fun_a()

这是一个调用自身的简单函数。此函数没有终止条件(当它必须停止调用自身并开始弹出在调用自身期间生成的堆栈内容时的条件)。这是一个无限递归的例子。如果您执行这样的函数,您将得到类似以下的错误消息:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in fun_a
  File "<stdin>", line 2, in fun_a
  File "<stdin>", line 2, in fun_a
  [Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded

示例2:

>>> def fun_b(n):
...     if n == 0:
...             return
...     fun_b(n-1)

在这种情况下,即使函数一次又一次地调用自己,但是有一个终止条件,它将阻止函数再次调用自己。这是一个有限递归的例子,我们说递归在基本情况下展开(这里基本情况是当n的值变成0)。你知道吗

总之,这就是我们所说的有限递归的一般格式。基本情况和递归调用的顺序应该与这里提到的相同。否则,函数将永远不会停止调用自身,并将导致无限递归。你知道吗

function_name(parameters)
  base case
recursive call

函数是递归的,因为它调用自己。所以,不,从技术上讲,你不需要从调用中返回值,它是递归的。你知道吗

但是,要使函数正常工作,您必须这样做。考虑这个例子:

def factorial(n):
    if n == 0:
        return 1
    else:
        return factorial(n-1) * n

这与:

def factorial(n):
    if n == 0:
        result = 1
    else:
        result = factorial(n-1) * n
    return result

如果我们将下一行改为最后一行,您认为会发生什么

        factorial(n-1) * n

现在不再分配result,函数可能会失败,声称result没有值。如果我们以类似的方式更改原件:

def factorial(n):
    if n == 0:
        return 1
    else:
        factorial(n-1) * n

它将计算factorial(n-1) * n,但它将简单地丢弃结果,并且由于后面没有语句,因此函数将返回(!)如果没有return语句,则返回None。你知道吗

相关问题 更多 >