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

时间:2014-04-13 23:16:03

标签: javascript recursion

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

我认为我理解递归的基本原理,它只是意味着你在函数本身内调用函数。这可用于执行各种循环,但我无法弄清楚上面的代码实际上如何决定循环以便找出数字的指数值。我使用功能(2,5)作为我的论据,功能知道答案是32,但是怎么样?函数是否循环自己每次从指数中减去1,并将base * base乘以指数达到零?如果是这样的话,那么在函数中调用幂函数如何完成这个呢?一旦指数达到零,那么函数不会返回1而不是正确的答案吗?

5 个答案:

答案 0 :(得分:4)

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

最简单的问题是功率(基数,0),它满足exponent == 0并返回一个(第零功率的任何基数为1)。

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

因此,2 ^ 5或幂(2,5)变为2 * 2 ^ 4。并且2 ^ 4 = 2 * 2 ^ 3。通过继续此扩展,我们得到2 * 2 * 2 * 2 * 2 * 1,等于32. 1表示exponent == 0为真。

计算必须跟踪它累积了多少这些乘法,并且一旦达到exponent == 0的基本情况,就将所有数字相乘。它无法事先知道power(base, exponent-1)会返回什么。

答案 1 :(得分:4)

按照通话模式..假设我们做功率(2,2)..你得到这个:

电力(2,2) - > (指数!= 0)2 *幂(2,1)

2 * power(2,1) - > (指数!= 0)2 *幂(2,0)

2 * 2 *功率(2,0) - > (指数== 0)1

2 * 2 * 1 = 4

它的工作方式基本上就是你的调用堆栈,只要你继续调用子方法,你的父方法就不会返回。所以它一直保持嵌套直到它碰到一个混凝土# - 在这种情况下,1,然后它回到堆栈实际做*。

答案 2 :(得分:2)

这显示了可以帮助您遵循逻辑的中间结果:
每个级别都有自己的基数,指数,答案值。

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)); 

答案 3 :(得分:0)

解释上述递归的最佳方法是查看控制台返回的内容

 function power(base, exponent) {
     // termination/base case
     if (exponent == 0)
        return 1;
     // recursive case
     else
        console.log(base + ':' + exponent)
        return base * power(base, exponent - 1);

     //  2 * (2, 4) = 4
     //  4 * (2, 3) = 8
     //  8 * (2, 2) = 16
     //  16 *(2, 1) = 32
     //  16 *(2, 0) = 1 recursive stops and returns 1
     //  function calls the last return  = 32

  } 

  var result = power(2,10)
  console.log(result)

我希望这能让您更直观地了解这种递归的工作原理

答案 4 :(得分:0)

当我第一次看到它时,这也让我感到困惑,经过10分钟的主演,它刚刚来到我身边......没有什么神奇的......

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

console.log(power(2,5));

这是它如何贯穿:

return base * power(base, exponent - 1)
看着上面的这一行,我也迷失了。没有对给定的参数2和5进行操作(+, - ,*,/,%),但不知何故,最后,console.log只知道产生正确的数字。

因为它没有返回数值,所以当程序达到 power(base,exponent -1)时,它只返回 base * power(base,exponent -1)本身,它在返回发生之前执行,直到指数== 0 变为真。

第一: 返回基数*功率(基数,5 - 1);

第二: 返回基数*基数*幂(基数,4 - 1);

第三: return base * base * base * power(base,3 - 1);

第四: return base * base * base * base * power(base,2 - 1);

第五: return base * base * base * base * base * power(base,1 - 1);

第六: return base * base * base * base * base * 1;

  

因为if(exponent == 0)返回1

所以: 2 * 2 * 2 * 2 * 2 * 1 = 32