我想知道,什麼是最好的方法來編寫一個遞歸函數沒有直接的基本情況下(例如:factorial),例如,計算嵌套數組中的元素數我有兩種方法,第一種以下是優選的,因爲它直接返回結果:JavaScript沒有明確的基本情況遞歸函數?
第二個保持在附連到函數的變量計數,工作得很好,但是處理結果&重置變量是奇異的。
任何指針讚賞。
我想知道,什麼是最好的方法來編寫一個遞歸函數沒有直接的基本情況下(例如:factorial),例如,計算嵌套數組中的元素數我有兩種方法,第一種以下是優選的,因爲它直接返回結果:JavaScript沒有明確的基本情況遞歸函數?
第二個保持在附連到函數的變量計數,工作得很好,但是處理結果&重置變量是奇異的。
任何指針讚賞。
你可以簡單的返回值,你感興趣的是:
function countElements(arr) {
var count = 0;
for (var i=0; i<arr.length; i++) {
if (arr[i] instanceof Array) {
count += countElements(arr[i]); // recursion here
} else {
count++; // normal element counts as 1
}
}
return count;
}
演示:http://jsbin.com/ejEmOwEQ/1/edit
警告:如果數組包含自引用(var arr = []; arr.push(arr); countElements(arr);
)
寫這個的正確方法很簡單:
function countElements (obj) {
if (obj instanceof Array) {
var count = 0;
for (var i in obj)
count += countElements(obj[i]);
return count;
}
return 1
}
您要查找的終止條件是if not instanceof Array
。在我的代碼中,上面的代碼只是從if instanceof Array
塊開始的。
您不需要在遞歸函數中保留一個像count
這樣的臨時變量。你仍然在反覆思考(當然,for循環是迭代的,所以你需要一個count
變量)。
遞歸函數通過接受參數和返回結果來做所有事情。沒有必要的任務。實際上,上面的代碼可以是純遞歸寫入而不使用一個for循環,因此無需使用一count
變量:,如果對象不是我們返回1的數組,如果對象:
function countElements (obj) {
if (obj instanceof Array) {
if (obj.length) {
return countElements(obj.shift()) + countElements(obj);
}
return 0;
}
return 1;
}
有3個規則是一個空數組,我們返回0,否則我們計數數組中的第一項+數組其餘部分的總和。
張貼代碼的屏幕截圖沒有幫助。只需將代碼粘貼到您的問題中即可。 – Dennis
爲什麼你不能把它作爲參數傳遞?另外,我不確定要理解數組中元素的基數的作用。 – plalx
嚴重的是,無法複製粘貼代碼使得回答這個問題困難得多。 – slebetman