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