2017-05-12 35 views
1

我想要使用遞歸和沒有循環來獲得數組的所有數字的階乘(recurArray)。 我得到錯誤「最大調用堆棧大小超出」 我認爲有一些問題在for循環的邏輯,將是有益的,如果有人能解釋錯誤的原因以及如何解決它遞歸地獲取數組的所有數的階乘

感謝。

//代碼

function recur(){ 
var n; 
var result; 
if(n == 1) 
return 1; 
var recurArray = [5,6,7,8,9]; 
for (var i = 0;i<recurArray.length;i++){ 
    n = recurArray[i]; 
    result = n * recur(n-1); 
    n=n-1; 

} 
console.log("val of n " + n + "value of i " + i); 
return result; 

} 
recur(); 
+1

你的'recur'函數沒有任何參數? – Bergi

+1

是的,如果你不想使用循環,你絕對不應該使用'for'循環 – Bergi

+0

[JavaScript中的快速析因函數]的可能重複(http://stackoverflow.com/questions/3959211/fast-factorial-函數在JavaScript中) – dave

回答

0

recur()功能或許應該採取n作爲一個參數,否則n將永遠1if(n == 1) return 1;)和你的函數將保持自稱,直到它崩潰。

嘗試用function recur(n){代替。

+0

JavaScript中沒有'int' – Bergi

+0

@Bergi修復了它,謝謝 – kalsowerus

0

正如你有數組,你應該使用循環。

function recur(x) { 
 
    if(x==0) { 
 
     return 1; 
 
    } 
 
    return x * recur(x-1); 
 
} 
 

 
function getFact() { 
 
    var recurArray = [5,6,7,8,9]; 
 
    for (var i = 0;i<recurArray.length;i++){ 
 
     console.log(recur(recurArray[i])); 
 
    } 
 
} 
 

 
getFact();

+0

感謝Rishi,我現在能夠獲得階乘。 –

0

在每種情況你重置階乘所以它不斷翻滾的事實,(5),你需要有一個計算階乘和另一個用於循環在你的陣列的功能等這樣的:

function recur(n){ 
    if(n == 1){ 
     return 1; 
    } else { 
     return n* recur(n-1); 
    } 
} 


var recurArray = [5,6,7,8,9]; 
for (var i = 0;i<recurArray.length;i++){ 
    n = recurArray[i]; 
    result = recur(n); 
    console.log("factorial of n " + n + " is " + result); 
} 
0

嘗試這樣:

function factorial(number) { 
var temp; 

if(number <= 1) return 1; 

temp = number * factorial(number - 1); 
return temp; 
} 

在這種情況下階乘(5);將返回!5。遞歸函數不應該有內部循環(他們可以,但執行時間會很可怕)。 也遞歸函數用不同的參數調用它們(否則你會溢出瀏覽器堆棧)。在你的情況下,你可以調用recursive()無限次的循環,循環始終從5開始,無限次。傳遞的參數是什麼停止遞歸。