【问题标题】:javascript explain this code function call it selfjavascript解释这个代码函数调用它自己
【发布时间】:2020-10-10 22:22:12
【问题描述】:

请有人给我解释一下

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 在返回部分函数调用本身 在第一个输入处与 x 的值相同,即 2 在第二个输入是 n - 1 当函数再次运行时,x 的值保持与 2 相同,n 的值变为 3 如果为假,则意味着 3 次 如果为真并且执行循环结束并在警报中显示答案,则在 4 次中 我无法弄清楚每次运行乘以 x 的数字,或者答案应该与 2 相同 因为每次执行函数时,x的值不应该等于2吗?

【问题讨论】:

标签: javascript call func


【解决方案1】:

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

我还编辑了您的 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));

【讨论】:

  • 谢谢大家的回答,谢谢KayD的回答
  • 其实第一次总是乘以 1 ,我用加减法看看这种情况下会发生什么,在 plus 得到这样 2+1=3 - 2+3=5 - 2+5=7 - 2+7=9 这意味着答案是错误的,除非第一次将数字乘以 1 nnd 下一次加上 2*1=2 - 2+2=4 - 2+4=6 - 2+6=8 或 2*1=2 。 2-2=0。 2-0=2。 2-2=0 即使是 ÷
【解决方案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

现在我们需要回溯,因为每个嵌套函数调用都将结果返回给它的调用者:

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

【讨论】:

    【解决方案3】:

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

    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,我们完成了。 您可以阅读一些有关递归的内容,以更好地了解正在发生的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 2015-01-09
      • 2018-02-25
      • 1970-01-01
      相关资源
      最近更新 更多