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

标签 javascript recursion

虽然这是一个非常简单的示例,但我无法理解这种递归。当它转到 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/

相关文章:

javascript - 如何更新 firestore 中的数组

javascript - express.js(静态服务器)未加载我的 JavaScript

python - 如何消除包含控制流的Python函数中的递归

c - 在 C 中递归地反转字符串 - 仅使用指向字符串的指针

javascript - 如何检查深层对象是否有值(value)

SQL:如何从递归查询创建 View ?

javascript - JS数组find()返回找到的元素以外的东西

javascript - JS "If & else"未正确响应

javascript - 使用 javascript 对 MSword 文档文本进行分页

json - 使用 jq 解析 JSON 和 JSON 值