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 就是您在输出中得到的结果
这是一个递归幂函数。它的作用如下:
2^4 = ?
2 * 2^3 = ?
2 * 2 * 2^2 = ?
2 * 2 * 2 * (2^1) = ?
// 此时我们到达 n == 1
,这就是结果只是 x
,在您的示例中是 2
。从这一点我们可以开始“后退”
2 * 2 * (2 * 2) = ?
2 * (2 * 4) = ?
(2 * 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));
请有人给我解释一下
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)
变为 8func(2, 3)
返回 8,将2 * func(2, 4)
变为 16- 16 就是您在输出中得到的结果
这是一个递归幂函数。它的作用如下:
2^4 = ?
2 * 2^3 = ?
2 * 2 * 2^2 = ?
2 * 2 * 2 * (2^1) = ?
// 此时我们到达n == 1
,这就是结果只是x
,在您的示例中是2
。从这一点我们可以开始“后退”2 * 2 * (2 * 2) = ?
2 * (2 * 4) = ?
(2 * 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));