Python 这个递归语句是如何工作的?

Python 这个递归语句是如何工作的?,python,Python,我有两个做同样事情的递归语句,我理解第一个语句是如何工作的,但我对第二个情况感到困惑 一, 第一种情况是,尽管它在回忆自己,但它仍然留下了一个可变的基数,以便在每次使用该方法时进行乘法 二, 在这种情况下,我不明白它是如何工作的,如果它是一个偶数,没有像第一种情况那样的变量,当这个数是偶数时,它似乎总是给自己不同的参数,但在任何一点上它实际上都没有处理任何特定的变量,比如base 如果方法中没有正文,参数是否返回值?让我们举个例子: print recurPowerNew(3, 4) 所以基数

我有两个做同样事情的递归语句,我理解第一个语句是如何工作的,但我对第二个情况感到困惑

一,

第一种情况是,尽管它在回忆自己,但它仍然留下了一个可变的基数,以便在每次使用该方法时进行乘法

二,

在这种情况下,我不明白它是如何工作的,如果它是一个偶数,没有像第一种情况那样的变量,当这个数是偶数时,它似乎总是给自己不同的参数,但在任何一点上它实际上都没有处理任何特定的变量,比如base

如果方法中没有正文,参数是否返回值?

让我们举个例子:

print recurPowerNew(3, 4)
所以基数是3,exp是8。这将属于您所关心的情况,请致电:

return recurPower(9, 2)
。。。这也将属于相同的情况,并调用

return recurPower(81, 1)
啊哈!这种情况很奇怪。因此,这将称为:

return 81 * recurPower(81, 0)
乘法的第二项是1,所以我们返回81,一直到堆栈的最上面。如果你遵循这一点,它也适用于不是二的幂的数字

这一点是,它比第一种方法更有效。它将为指数的每一位生成一个或两个堆栈帧。第一种方法将生成指数堆栈帧

顺便说一句,第二个例子可以更有效地观察到,如果指数为奇数,减去1将产生偶数指数,因此我们可以直接处理:

     return base * recurPowerNew(base*base, exp // 2)

如果使用Python 2,请使用/而不是//第一个参数不返回值,函数返回值

第二,我知道你们可能会对递归问题感到困惑。递归不要求有一个作用的变量。只要递归最终到达基本情况,它就会返回一个值

例如,这里有一个无用的递归函数,它为任何整数返回1

def foo(n):
  if n <= 1:
    return 1
  else:
    return foo(n-1)
因为exp=10,这是偶数,所以第一个返回值将是:

recurPowerNew(2 * 2, 5)
这是在利用2^10=2^2^5这一事实。现在我们必须计算新的返回函数。尽管我们只生成了一个新函数,但我们已经朝着exp=0的基本情况取得了进展。所以最终我们希望得到一个答案

现在我们有一个奇数基,所以返回值是:

4 * recurPowerNew(4, 4)
现在我们又有了一个函数,我们必须对它求值,但事实就是这样 它只返回一个新函数

4 * recurPowerNew(4 * 4, 2)
甚至再一次

4 * recurPowerNew(16 * 16, 1)
一个奇数函数,我们得到另一个因子

4 * (256 * recurPowerNew(256, 0))
啊,现在我们在基本情况下,没有更多的递归

4 * 256 * 1
我们可以对结果进行评估并得出结论

1024

这项工作的关键在于,每次迭代时,我们都离基本情况更近,我们能够进行的调用也更少,因为除以2比减去1更快地减少指数。

如果方法中没有实体,参数是否会返回值?参数不返回值,函数返回递归函数的每次返回都会弹出一个stackframe,这会恢复包含base的帧。@ElliottFrisch抱歉,我还是不太理解它,方法的这一部分不包含基elif exp%2==0:return recurPowerNewbase*base,exp/2在我看来,它每次都只是更改参数。base*base不包含基吗?或者它不会将递归的结果乘以另一种情况……但是,该值如何保留参数?在第一个和第二个奇怪的部分示例中,基础在参数之外。谢谢,这正是我缺少的。81,1最终它会变得奇怪,这就是它离开参数的方式。非常感谢:这也是一个非常有用的递归观点。我会投票,但我没有足够的声望点数。
4 * (256 * recurPowerNew(256, 0))
4 * 256 * 1
1024