因子代码有效,但为什么

时间:2017-03-13 17:42:02

标签: factorial

我正在解决一个因子问题,其中函数接受一个数字并返回该数字的阶乘。

我遇到的问题是代码有效,但我不知道为什么。在代码执行后没有循环可以回调它,我甚至不确定当前值的存储位置。如果我是正确的,我认为每次返回时它都会重新运行该函数,它是使用n-1值运行所以比前一次运行的数字少一个数字,但是,我仍然没有看到该值是如何通过当前值存储到每个数字的多个。即使我在每次运行后记录n的当前值,我得到的数字是10到1。我认为当前值会改变为乘积值。

此代码再次完美无缺,我只需要了解原因。

function factorial(n) {
    if (n === 0) {
        return 1;
    }
    console.log(n);
    return n * factorial(n - 1);
}

factorial(10);

1 个答案:

答案 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)