Factorial 阶乘代码可以工作,但为什么

Factorial 阶乘代码可以工作,但为什么,factorial,Factorial,我正在解决一个阶乘问题,函数取一个数并返回该数的阶乘 我遇到的问题是代码可以工作,但我不知道为什么。代码执行后,没有循环可以调用它,我甚至不确定当前值存储在哪里。如果我正确,我假设函数在每次返回时都会重新运行,并且它的运行值为n-1,因此比上次运行时少了一个数字,我仍然不知道该值是如何被存储为当前值乘以每个数字的。即使我在每次运行后记录当前的n值,我得到的只是数字10到1。我认为当前值会变为乘以的值 同样,这段代码工作得很好,我只需要理解为什么 function factorial(n) {

我正在解决一个阶乘问题,函数取一个数并返回该数的阶乘

我遇到的问题是代码可以工作,但我不知道为什么。代码执行后,没有循环可以调用它,我甚至不确定当前值存储在哪里。如果我正确,我假设函数在每次返回时都会重新运行,并且它的运行值为n-1,因此比上次运行时少了一个数字,我仍然不知道该值是如何被存储为当前值乘以每个数字的。即使我在每次运行后记录当前的n值,我得到的只是数字10到1。我认为当前值会变为乘以的值

同样,这段代码工作得很好,我只需要理解为什么

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

factorial(10);

这里有一个递归函数——一个调用自身的函数。您还需要记住函数中变量的“范围”

参数“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)
例如:

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)

这是递归函数的一个非常基本的示例。我建议大家阅读一下它们是如何工作的: