虽然这是一个非常简单的示例,但我无法理解这种递归。当它转到 power(base, exponent - 1);
时,它应该做什么?当不断调用 power 直到 exponent
等于 0 时,事情是如何成倍增加的?
function power(base, exponent) {
if (exponent === 0) {
return 1;
} else {
return base * power(base, exponent - 1);
}
}
最佳答案
让我们从头开始。
假设您调用 power(base, 0)
。由于 exponent
为 0,函数返回 1。
现在,假设您调用 power(base, 1)
。由于 exponent
这次不为 0,该函数调用 power(base, exponent - 1)
并将其乘以 base
。 (这是这里的关键……它获取递归调用的结果,并添加自己的扭曲。)因为 exponent - 1
= 0,并且 power(base, 0)
为 1,结果实际上是 base * 1
。阅读:base
。
现在开始power(base, 2)
。最终是 base * power(base, 1)
。而power(base, 1)
就是base * power(base, 0)
。最终结果:base * (base * 1)
。读取:base
平方。
等等。
如果不是很明显,顺便说一下,这个函数只适用于非负整数指数。如果 exponent
是负数,或者比整数多或少一点点,该函数将“永远”运行。 (实际上,一旦递归耗尽所有堆栈,您很可能会导致堆栈溢出。)
你可以用一些代码修复负幂的函数
if (exponent < 0) return 1 / power(base, -exponent);
至于非整数...除了抛出异常之外,没有什么好的方法可以解决这个问题。将数字计算为非整数次方是有道理的,因此您不想只 chop 指数或假装他们没有尝试这样做——您最终会返回错误的答案。
关于javascript - 有人可以解释这个递归的 JS 代码来计算指数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9610545/