Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的递归函数_Python_Recursion - Fatal编程技术网

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

考虑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如何执行包含不在同一代码行内但在同一代码行内的另一个递归的递归?“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))