Python中的递归函数
考虑Python中的基本递归:Python中的递归函数,python,recursion,Python,Recursion,考虑Python中的基本递归: def fibonacci(number): if number == 0: return 0 elif number == 1: return 1 else: return fibonacci(number-1) + fibonacci(number-2) 根据斐波那契级数的(n-1)+(n-2)函数,这是有意义的 Python如何执行包含不在同一代码行内但在同一代码行内的另一个递归的递归?“finoba
def fibonacci(number):
if number == 0: return 0
elif number == 1:
return 1
else:
return fibonacci(number-1) + fibonacci(number-2)
根据斐波那契级数的(n-1)+(n-2)函数,这是有意义的
Python如何执行包含不在同一代码行内但在同一代码行内的另一个递归的递归?“finobacci(number-1)”是否完成所有递归,直到达到“1”,然后对“fibonacci(number-2)”执行相同的操作并添加它们
作为比较,下面的递归函数用于将数字“x”提升为幂“y”,我可以理解递归,def power调用自己直到y==0,因为一行中只有一个递归调用。仍然不应该所有结果都是“1”,因为当y==0时执行的最后一个命令是“return 1”,因此不返回x
def power(x, y):
if y == 0:
return 1
else:
return x*power(x, y-1)
在表达式
fibonacci(number-1)+fibonacci(number-2)
中,第一个函数调用必须在调用第二个函数调用之前完成
因此,第一次调用的整个递归堆栈必须在第二次调用开始之前完成。Short-Answer
每次Python“看到”fibonacci()
时,它都会进行另一个函数调用,直到完成该函数调用为止
例子
假设它在计算fibonacci(4)
一旦到达返回fibonacci(number-1)+fibonacci(number-2),它“看到”调用fibonacci(number-1)
所以现在它运行的是fibonacci(3)
——它还没有看到fibonacci(2号)
。要运行fibonacci(3)
,它必须计算出fibonacci(2)+fibonacci(1)
。同样,它运行它看到的第一个函数,这一次是fibonacci(2)
现在,当运行fibonacci(2)
时,它终于遇到了一个基本情况。它计算fibonacci(1)
,返回1
,然后第一次可以继续执行+fibonacci(number-2)
调用的fibonacci()部分fibonacci(0)
返回0
,然后让fibonacci(2)
返回1
既然fibonacci(3)
已经获得了从fibonacci(2)
返回的值,它就可以继续计算fibonacci(数字2)
(fibonacci(1)
)
此过程将继续,直到所有内容都经过评估,并且fibonacci(4)
可以返回3
要查看整个评估过程,请按照此图中的箭头进行操作:
“finobacci(number-1)”是否完成所有递归,直到达到“1”,然后对“fibonacci(number-2)”执行相同的操作并添加它们
是的,完全正确。换句话说,以下是
return fibonacci(number-1) + fibonacci(number-2)
相当于
f1 = fibonacci(number-1)
f2 = fibonacci(number-2)
return f1 + f2
您的第二个递归函数会执行此操作(示例),因此不会返回1
power(2, 3)
2 * power(2, 2)
2 * 2 * power(1,2)
2 * 2 * 2 * power(0,2) # Reaching base case
2 * 2 * 2 * 1
8
我真的建议你把代码放进去
你将能够在飞行中得到它。请参阅stackframe、参考等。您可以自己解决这个问题,方法是在函数中添加一个打印函数,并添加一个深度,以便我们可以将其打印得更漂亮:
def fibonacci(number, depth = 0):
print " " * depth, number
if number == 0:
return 0
elif number == 1:
return 1
else:
return fibonacci(number-1, depth + 1) + fibonacci(number-2, depth + 1)
调用fibonacci(5)
将为我们提供:
5
4
3
2
1
0
1
2
1
0
3
2
1
0
1
我们可以看到5
调用4
,然后调用3
,然后调用3
,最后调用完成。马修和玛特金是对的,但我想我可以详细说明一下:
Python尽可能从左到右进行操作。括号中暗示了这条规则的例外情况
在x*幂(x,y-1)
中:计算x
,然后计算power
在fibonacci(number-1)+fibonacci(number-2)
中,对fibonacci(number-1)
进行求值(递归地,直到它停止),然后对fibonacci(number-1)
进行求值您可以使用该模块通过简单地向递归函数添加一个修饰符来可视化递归
以下是上述代码的可视化:
这些边按照执行过程遍历它们的顺序进行编号。边从黑色逐渐变为灰色,以指示遍历顺序:首先是黑色边,最后是灰色边
(我在上写了rcviz模块。)def fib(n):
如果n
即使不阅读文本,可视化也有助于快速理解。谢谢你的工作。
def fib(n):
if n <= 1:
return n
else :
return fib(n - 1) + fib(n - 2)
def fib(x):
if x == 0 or x == 1:
return 1
else:
return fib(x-1) + fib(x-2)
print(fib(4))