提问者:小点点

需要帮助理解来自 Eloquent Javascript 的递归函数示例


function power(base, exponent) {
  if (exponent == 0)
  return 1;
else
  return base * power(base, exponent - 1);
}

我认为我理解递归的基本原理,这仅仅意味着你在函数本身内调用函数。这可以用于执行排序循环,但我无法理解的是,上面的代码实际上是如何决定循环的,以便计算出数字的指数值。我使用函数幂(2,5)作为我的论点,函数知道答案是32,但怎么做?函数本身是否每次从指数中减去1,然后乘以基数*基数直到指数达到零?如果是这样的话,那么调用函数中的幂函数是如何实现这一点的呢?一旦指数达到零,函数就不会返回1而不是正确答案吗?


共3个答案

匿名用户

我认为每个递归步骤(函数调用本身)都会产生一个更短、更容易的问题。

最简单的问题是幂(基数,0),它满足指数==0并返回1(零次幂的任何基数都是1)。

然后,请注意,无论指数有多大,它都会将指数减少 1,从而保证它最终会达到指数为零的“最简单”问题。它不能是负数,否则这个“基本情况”永远不会达到。

因此,2^5 或幂 (2, 5) 变为 2 * 2^4。和 2^4 = 2 * 2^3。通过继续这个扩展,我们得到 2 * 2 * 2 * 2 * 2 * 1,等于 32。1 表示事例指数 == 0 为真。

计算必须跟踪它累积了多少次乘法,一旦达到指数 == 0 的基本情况,将所有数字相乘。它无法事先确切地知道什么幂(基数,指数-1)将返回。

匿名用户

遵循调用模式。.假设我们做幂(2,2)。你得到这个:

电源(2,2) -

2 *幂(2,1) -

2 * 2 * 功率(2,0) -

2*2*1=4

它的工作方式基本上是你的调用栈,只要你一直调用子方法,你的父方法就不返回。所以它一直嵌套自己,直到遇到一个具体的#,在这个例子中,是1,然后它回到栈上,实际上是在做*。

匿名用户

这显示了中间结果,可能有助于您理解逻辑:< br >每个级别都有自己的底数、指数和答案值。

function power(base, exponent) {
  var answer; // local
  level = level + 1;
  console.log("Entering: power(" + base + ", " + exponent + 
      ") (level " + level + ")");
  if (exponent == 0) { // don't recurse any more
    answer = 1; }
  else {               // recurse to get answer
    answer = base * power(base, exponent - 1); }
  // now return answer
  console.log("Leaving: power("+ base + ", " + exponent + 
      ") (level " + level + ") ans=" + answer);
  level = level - 1
  return answer;
  }
var level = 0; // global
console.log("Final answer: " + power(2, 5));