javascript 解释这段代码函数调用它自己

javascript explain this code function call it self

请有人给我解释一下

function func(x, n) {
  if (n == 1) {
    return x;
  } else {
    return x * func(x, n - 1);
  }
}
console.log(func(2, 4)); // 16

怎么回答是16

我无法理解更多 当 if 为 false 时,它​​会去 else 在 return 部分函数调用自身 在第一个输入是与 x 相同的值,即 2 在第二个输入是 n - 1 当函数再次 运行 时,x 的值保持与 2 相同,n 的值变为 3 如果为假,则意味着 3 次 在 4 次 if if if true 和执行循环结束并在警报中显示答案 我不知道每个 运行 乘以 x 的数字是多少,或者答案应该与 2 相同 因为每次执行函数时,x的值不应该等于2吗?

该函数执行求幂运算。所以 func(x, n) 正在计算 xn.

它使用递归,基于以下原则:

  • 当n为1时,则xn = x1 = x
  • 当n > 1时,则xn = x.xn-1

对于第二个语句,我们可以使用带有参数 x 和 n-1 的函数。

具体的例子,func(2, 4),是这样的:

x=2,n=4,所以我们进入 else 块并计算:

2 * func(2, 3)

对于 func 的嵌套调用,我们有 x=2,n=3,我们再次进入 else 块:

2 * func(2, 2)

我们还有一个嵌套调用,计算结果为:

2 * func(2, 1)

...最后的嵌套调用进入 if 块并评估为:

2

现在我们需要回溯每个嵌套函数调用 returns 结果给它的调用者:

  • 2 返回 func(2, 1),将 2 * func(2, 1) 变为 4
  • func(2, 2) 返回 4,将 2 * func(2, 2) 变为 8
  • func(2, 3) 返回 8,将 2 * func(2, 4) 变为 16
  • 16 就是您在输出中得到的结果

这是一个递归幂函数。它的作用如下:

  1. 2^4 = ?
  2. 2 * 2^3 = ?
  3. 2 * 2 * 2^2 = ?
  4. 2 * 2 * 2 * (2^1) = ? // 此时我们到达 n == 1,这就是结果只是 x,在您的示例中是 2。从这一点我们可以开始“后退”
  5. 2 * 2 * (2 * 2) = ?
  6. 2 * (2 * 4) = ?
  7. (2 * 8) = ?
  8. 16 = ? // 16 就是 16,我们完成了。 您可以阅读一些关于递归的内容,以便更好地了解正在发生的事情。

如果你问的是递归是如何工作的,那么我会用这个基本的流程图来解释你。

我还编辑了您的 JS 代码,以便它为您提供说明。

function func(x, n) {
  if (n == 1) {
    return x;
  } else {
    let function_returned = func(x, n - 1);
    console.log(x, "*", function_returned, "=", x*function_returned)
    return x * function_returned
  }
}
console.log(func(2, 4));