我正在解决一个因子问题,其中函数接受一个数字并返回该数字的阶乘。
我遇到的问题是代码有效,但我不知道为什么。在代码执行后没有循环可以回调它,我甚至不确定当前值的存储位置。如果我是正确的,我认为每次返回时它都会重新运行该函数,它是使用n-1值运行所以比前一次运行的数字少一个数字,但是,我仍然没有看到该值是如何通过当前值存储到每个数字的多个。即使我在每次运行后记录n的当前值,我得到的数字是10到1。我认为当前值会改变为乘积值。
此代码再次完美无缺,我只需要了解原因。
function factorial(n) {
if (n === 0) {
return 1;
}
console.log(n);
return n * factorial(n - 1);
}
factorial(10);
答案 0 :(得分:1)
这里有一个递归函数 - 一个自我调用的函数。您还需要记住函数中变量的“范围”。
参数“n”的范围是函数的局部范围。每次调用该函数时,都会创建新变量。每个变量的范围是函数执行。
1: function factorial(n) {
2: if (n === 0) {
3: return 1;
4: }
5: console.log(n);
6: return n * factorial(n - 1);
7: }
示例:
Parameter Value = 0
Hence, n = 0
Execute factorial(0)
1. line 1: variable n = 0
2. line 2: check if n = 0
3. line 3: return 1
示例:
Parameter Value = 2
Hence, n = 2
Execute factorial(2)
1. line 1: variable n = 2 (scope = execution #A)
2. line 5: console log n = 2
3. line 6: return 2 * factorial(2-1) // Function calls itself
4. line 1: variable n = 1 (scope = execution #B)
5. line 5: console log n = 1
6. line 6: return 1 * factorial(1-1) // Function calls itself
7. line 1: variable n = 0 (scope = execution #C)
8. line 3: return 1 // #C returns 1
9. return 1 * 1 // #B returns 1 * 1 (from #C)
10. return 2 * 1 // #A returns 2 * 1 (from #B)