2013-10-04 78 views
-5

我想知道,什麼是最好的方法來編寫一個遞歸函數沒有直接的基本情況下(例如:factorial),例如,計算嵌套數組中的元素數我有兩種方法,第一種以下是優選的,因爲它直接返回結果:JavaScript沒有明確的基本情況遞歸函數?

code as image

第二個保持在附連到函數的變量計數,工作得很好,但是處理結果&重置變量是奇異的。

code as image

任何指針讚賞。

+8

張貼代碼的屏幕截圖沒有幫助。只需將代碼粘貼到您的問題中即可。 – Dennis

+0

爲什麼你不能把它作爲參數傳遞?另外,我不確定要理解數組中元素的基數的作用。 – plalx

+0

嚴重的是,無法複製粘貼代碼使得回答這個問題困難得多。 – slebetman

回答

0

你可以簡單的返回值,你感興趣的是:

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);

0
功能可能不會結束

寫這個的正確方法很簡單:

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,否則我們計數數組中的第一項+數組其餘部分的總和。