递归幂函数:如果没有初始返回值,为什么这会起作用?

千里ち*_*ちゃん 2 javascript recursion logic return-value exponential

因为幂(base,exponent)没有返回值,除非指数为0,最初,不应该为power(base,exponent -1)返回'undefined',因此最初是不可复制的?因此,我无法遵循此代码的逻辑.为什么/如何运作?

function power(base, exponent) {
  if (exponent == 0)
    return 1;
  else
    return base * power(base, exponent - 1);
}
Run Code Online (Sandbox Code Playgroud)

Tim*_*Tim 8

看看如果你试图计算会发生什么5^3:

power(5, 3)  ... this should give us 125, let's see if it does...

function power(base, exponent) {    // base = 5, exponent = 3
  if (exponent == 0)                // nope, exponent != 0
    return 1;
  else
    return base * power(base, exponent - 1);  // return 5 * power(5, 2)
}
Run Code Online (Sandbox Code Playgroud)

......是什么power(5, 2)?...

function power(base, exponent) {    // base = 5, exponent = 2
  if (exponent == 0)                // nope, exponent != 0
    return 1;
  else
    return base * power(base, exponent - 1);  // return 5 * power(5, 1)
}
Run Code Online (Sandbox Code Playgroud)

......是什么power(5, 1)?...

function power(base, exponent) {    // base = 5, exponent = 1
  if (exponent == 0)                // nope, exponent != 0
    return 1;
  else
    return base * power(base, exponent - 1);  // return 5 * power(5, 0)
}
Run Code Online (Sandbox Code Playgroud)

......是什么power(5, 0)?...

function power(base, exponent) {    // base = 5, exponent = 0
  if (exponent == 0)                // yup, exponent != 0
    return 1;                       // return 1
  else
    return base * power(base, exponent - 1);
}
Run Code Online (Sandbox Code Playgroud)

......当我们走回堆栈时,将它们放在一起,按相反的顺序排列......

power(5, 0) = returns 1
power(5, 1) = 5 * power(5, 0) = 5 * 1 =  returns 5
power(5, 2) = 5 * power(5, 1) = 5 * 5 =  returns 25
power(5, 3) = 5 * power(5, 2) = 5 * 25 =  returns 125

... so, power(5, 3) returns 125, as it should.
Run Code Online (Sandbox Code Playgroud)


Rob*_*obG 5

可能更简洁:

function power(base, exponent) {
  return exponent == 0? 1 : base * power(base, --exponent);
}
Run Code Online (Sandbox Code Playgroud)

但是,迭代解决方案的速度要快得多:

function powerNR(base, exp) {
  var result = 1;
  while(exp--) {
    result *= base;
  }
  return result;
}
Run Code Online (Sandbox Code Playgroud)

  • 迭代函数更快,因为它只是一个函数调用,而递归函数有多个(本身)调用。函数调用相对昂贵,请尽可能避免使用它们。递归函数可能非常简洁,但这不一定是使用它们的一个好理由。它们通常难以阅读且速度慢(但是,如果您想用少量代码做很多事情,它们看起来真的很酷)。 (2认同)