0

我正在学习 JavaScript,其中一个练习是编写一个幂函数。我也应该学习数学,因为这听起来肯定很愚蠢。

我凭直觉知道 $2 ^ 4 = 16$,因为 $2 * 2 * 2 * 2 = 16$。但通读该函数,它似乎应该返回 12,而不是 16。

如果我们插入数字,它应该是这样的:$$2 * (2 * (4 - 1)) = 12$$

var power = function( base, exponent ) {
  if ( exponent === 0 ) return 1;
  return base * power( base, exponent - 1 );
};
power(2,4);
===> 16

显然我一定是读错了函数。但是怎么做?

4

4 回答 4

2

您的函数编写正确,您可以从分析函数的结果开始,因为递归推进和指数减少。

  1. 参数:2、4。结果:2 * 幂 (2, 3) = 2 * 8 = 16。
  2. 参数:2、3。结果:2 * 幂 (2, 2) = 2 * 4 = 8。
  3. 参数:2, 2。结果:2 * power (2, 1) = 2 * 2 = 4。
  4. 参数:2, 1。结果:2 * power (2, 0) = 2 * 1 = 1。
  5. 参数:2, 0。结果:1。

希望这会有所帮助。

于 2012-05-20T14:47:31.230 回答
1

这递归地返回 16。如果 $function$ 由 $f$ 表示:

f(2, 4)=2*f(2, 3)=\dots=2*2*2*2*f(2, 0)=2*2*2*2*1=16

更普遍,

f(a, b)=a*...*a*1 <- n 次。

于 2012-05-20T14:40:33.317 回答
0

关键是递归

power(2,4)
   = 2 * power(2,3)
   = 2 * (2 * power(2,2))
   = 2 * (2 * (2 * power(2,1)))
   = 2 * (2 * (2 * (2)))
   = 16

power用较小的指数调用自身,它调用自身等,直到指数为 1,答案只是基数。

于 2012-05-21T11:28:07.990 回答
0

从头开始考虑函数的行为方式可能会有所帮助。

因此,当指数等于 $0$ 时,它将返回 $1$,这将乘以底数,所有这些都将再次乘以底数,依此类推,所以:

$$ (((2^0*2)*2)*2)\ldots)*2 $$

于 2012-05-20T14:46:26.747 回答