有人可以解释这个递归的JS代码来计算指数吗?

0x4*_*2D2 1 javascript recursion

即使这是一个非常简单的例子,我也无法理解这种递归.当它关系到power(base, exponent - 1);什么是应该做的?当电源持续被调用直到exponent等于0 时,事物如何成倍增加?

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

Boj*_*les 5

这类似于Math.pow(); 它提出了base论证的exponent论点.

例如,2 ^ 416,所以power(2, 4)会返回16.该if()语句检查指数(幂)是否为零,1如果是,则返回- 任何提升到幂0的数字等于1.

最后一行

return base * power(base, exponent - 1);
Run Code Online (Sandbox Code Playgroud)

是一个递归函数,它power()从内部调用,但是多次由值指定exponent.


我会尝试从下往上解释递归,或者我们说"从中间"; 它可能更容易理解.

底部大多数呼叫power()需要2,并1为它的参数,并返回1.然后在第二次调用中使用此返回值power(),因此这次传递的参数是22,哪些输出4,依此类推,直到power()传递到最顶层的调用24返回16.


cHa*_*Hao 5

让我们从头开始.

让我们说你打电话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);
Run Code Online (Sandbox Code Playgroud)

至于非整数......除了抛出异常之外,没有其他好方法可以解决这个问题.将数字提升为非整数幂是有道理的,因此您不希望仅截断指数或以其他方式假装他们没有尝试这样做 - 您最终会返回错误的答案.