当前位置: 首页 > 知识库问答 >
问题:

Python中的递归函数

上官波鸿
2023-03-14

考虑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,因为在一行中只有一个递归调用。既然当y==0时执行的最后一个命令是“return 1 ”,因此x没有被返回,那么所有的结果不都应该是“1”吗?

def power(x, y):
    if y == 0:
        return 1
    else:
        return x*power(x, y-1)

共有3个答案

上官鸿晖
2023-03-14

“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
段干飞翔
2023-03-14

在表达式 fibonacci(number-1) fibonacci(number-2) 中,第一个函数调用必须在调用第二个函数调用之前完成。

因此,第一次调用的整个递归堆栈必须在第二次调用开始之前完成。

欧阳楚
2023-03-14

每次Python“看到”fibonacci(),它都会进行另一次函数调用,直到完成该函数调用为止。

假设它正在评估fibonacci(4)

一旦它到达行< code > return Fibonacci(number-1)Fibonacci(number-2),它就“看到”调用< code>fibonacci(number-1)。

所以现在它运行的是斐波那契(3)-它还没有看到菲波那奇(2号)。要运行fibonacci(3),它必须计算出斐波那契(2)和斐波那奇(1)。同样,它运行它看到的第一个函数,这一次是斐波那契(2)

现在,当<code>fibonacci(2)fibonacci(1),返回1,然后第一次可以继续执行fibonac契()调用的斐波那契(数字-2)部分fibonacci(0)返回0,然后让斐波那契(2)返回1。

现在< code>fibonacci(3)已经获得了从< code>fibonacci(2)返回的值,它可以继续计算< code > Fibonacci(number-2)(< code > Fibonacci(1))。

这个过程一直持续到一切都被评估, 斐波那契(4)可以返回 3.

若要查看整个评估的进展情况,请按照下图中的箭头进行操作:

 类似资料:
  • 我试图在Python中做一个函数,它接受树的任意节点,并根据节点给出的列表填充列表。 考虑到以下绘制糟糕的树: 例如,如果我们从节点5开始,我们应该得到: 包含具有相同父节点的所有节点的列表,包括我们从(4和5)开始的节点。 任何子节点,但不是其子节点(6) 父节点和具有相同父节点的任何父节点,以及它们的父节点,等等,直到我们到达根节点,但不包括根节点(在本例中只有2和3个,但如果树更深,我们开始

  • 问题内容: 我很难理解修饰的递归函数是如何工作的。对于以下代码段: 输出为: 第一个打印f(n),因此很自然,每次递归调用f(n)时,它都会打印“原始”。 第二个打印def_f(n),因此当n传递给包装器时,它将递归调用f(n)。但是包装器本身不是递归的,因此仅打印一个“装饰”。 第三个让我感到困惑,这与使用装饰器@dec相同。为什么修饰的f(n)也调用包装器五次?在我看来,def_f = dec

  • 问题 你想在一个函数中调用相同的函数。 解决方案 使用一个命名函数: ping = -> console.log "Pinged" setTimeout ping, 1000 若为未命名函数,则使用 @arguments.callee@: delay = 1000 setTimeout((-> console.log "Pinged" setTimeout arg

  • 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出: fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n 所以,fact(n)可以表示为n x fact(n-1),

  • 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出: fact(n)=n!=1\times2\times3\times\cdot\cdot\cdot\times(n-1)\times n=(n-1)!\times n=fact(n-1)\times n

  • 本文向大家介绍如何在Python中编写递归函数?,包括了如何在Python中编写递归函数?的使用技巧和注意事项,需要的朋友参考一下 一个递归 函数是它的执行过程中调用自身的函数。这使函数可以重复多次,输出结果和每次迭代的结束。递归与无限有关。  下面是一个递归函数示例,用于查找整数的阶乘。 数字的阶乘 是从1到该数字的所有整数的乘积。  例如,阶乘9(表示为9!)为1 * 2 * 3 * 4 *