2017-03-13 56 views
-1

我正在解決一個因子問題,其中函數需要一個數並返回該數的階乘。因子碼有效,但爲什麼

我遇到的問題是,代碼的作品,但我不知道爲什麼。在代碼執行後沒有循環可以調用它,我甚至不知道當前值的存儲位置。如果我是正確的,我假定函數在每次返回時都會重新運行,它是以n-1的值運行,因此一個數字小於上一次運行的數字,但是,我仍然不知道如何通過當前值將值存儲到多個每個數字。即使我在每次運行後記錄n的當前值,我所得到的數字都是10到1之間的數字。我認爲現在的價值會變成乘數值。

這段代碼再次完美工作我只需要明白爲什麼。

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

factorial(10); 
+1

這是一個遞歸函數的一個非常基本的例子。我會建議閱讀他們的工作方式:https://en.wikipedia.org/wiki/Recursion_(computer_science)#Recursive_functions_and_algorithms – sunil

回答

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)