我编写了以下代码,可用于计算斐波那契数列:
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]
即使我在get_fib之前不使用return,这仍然是递归吗? 我是否需要包含return以使函数递归?
答案 0 :(得分:2)
该函数是递归的,因为它会自行调用。因此,不,从技术上讲,您无需从该调用中返回该值即可使其递归。
但是,要使该功能正常工作,您需要这样做。考虑以下示例:
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
。
答案 1 :(得分:1)
是的,根据定义,该函数是递归的,因为它会自行调用。调用return
的位置并不决定该函数是否递归。但是,如果您编写一个递归函数,它必须在某个时候返回 (称为“基本情况”),因为如果不这样做,则会导致无限递归,这将引发异常(一旦您通过Python解释器的max recursion limit,就会出现“ 运行时错误:超过最大递归深度”。
答案 2 :(得分:0)
请考虑两个示例:
示例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
答案 3 :(得分:0)
即使没有return语句,函数也可以是递归的。经典示例是对二叉树的inorder
遍历。它没有return语句。递归函数的唯一要求是它应该自行调用。下面是代码(在C中)。
void inorder(struct node* root)
{
if (root)
{
inorder(root->left);
printf("%d", data);
inorder(root-right);
}
}