示例 1
function x(num) {
if (num == 0) {
return 1;
}
else {
return (num * x(num - 1));
}
}
x(8);
8 * 7 * 6 * 5 * 4 * 3 * 2 * 1
结果为 40320 符合预期
示例 2
function x(num) {
if (num == 0) {
return 0;
}
else {
return (num + x(num - 1));
}
}
x(8);
8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 0
结果为 36 正如预期
示例3
function x(num) {
if (num == 0) {
return 0;
}
else {
return (num - x(num - 1));
}
}
x(8);
8 - 7 - 6 - 5 - 4 - 3 - 2 - 1 - 0
结果是4
有人能解释一下为什么吗?
答案不应该是-20吗?
最佳答案
您的函数的计算基本上是从右到左:
8 - 7 - 6 - 5 - 4 - 3 - 2 - 1 - 0
= 8 - 7 - 6 - 5 - 4 - 3 - 2 - 1
= 8 - 7 - 6 - 5 - 4 - 3 - 1
= 8 - 7 - 6 - 5 - 4 - 2
= 8 - 7 - 6 - 5 - 2
= 8 - 7 - 6 - 3
= 8 - 7 - 3
= 8 - 4
= 4
这是因为每次递归调用函数x
时,都会尝试计算最右边的表达式。
实际上,“堆栈”看起来像这样:
8 - x(8 - 1)
= 8 - (7 - x(7 - 1))
= 8 - (7 - (6 - x(6 - 1)))
= 8 - (7 - (6 - (5 - x(5 - 1))))
= 8 - (7 - (6 - (5 - (4 - x(4 - 1)))))
= 8 - (7 - (6 - (5 - (4 - (3 - x(3 - 1))))))
= 8 - (7 - (6 - (5 - (4 - (3 - (2 - x(2 - 1)))))))
= 8 - (7 - (6 - (5 - (4 - (3 - (2 - (1 - x(1 - 1))))))))
= 8 - (7 - (6 - (5 - (4 - (3 - (2 - (1 - 0)))))))
= 8 - (7 - (6 - (5 - (4 - (3 - (2 - 1))))))
= 8 - (7 - (6 - (5 - (4 - (3 - 1)))))
= 8 - (7 - (6 - (5 - (4 - 2))))
= 8 - (7 - (6 - (5 - 2)))
= 8 - (7 - (6 - 3))
= 8 - (7 - 3)
= 8 - 4
= 4
JavaScript 对“纯”减法的评估是:
8 - 7 - 6 - 5 - 4 - 3 - 2 - 1 - 0; // -20
关于Javascript 递归减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32999214/