2014-02-17 53 views
2

想,如果我給'ABC' 輸入再然後,我希望有一個字母的'ABC', 'ACB', 'CAB', 'CBA', 'BAC', 'BCA' 。每個單詞都有的組合!其中n是字母的長度。我認爲遞歸可以使它更容易。這裏是我用JavaScript編寫的代碼:組合使用遞歸

function reArrange(word) 
{ 
    console.log(word); 
    if (word.length < 0) { 
     return (-1); 
    } 
    else if (word.length == 0) { 
     return (''); 
    } 
    else { 
     for (var _i = 0; _i < word.length; _i++) { 
      var temp = word[_i]; 
      for (var _j = 0; _j < word.length; _j++) { 
       if (_i != _j) { 
        return word[_i] + reArrange(word.slice(_i, word.length)); 
       } 
      } 
     } 
    } 
} 

請使用詳細的評論。

+0

這可能幫助:http://stackoverflow.com/questions/6359344/find-ncr-combinations- for-array-items – techfoobar

+0

我很好奇這是什麼用例 –

+3

問題是什麼?如果您想要查看代碼,請將其發佈在[CodeReview.SE](http://codereview.stackexchange.com/) – amit

回答

4
function combinations(current_string, actual_string, seen) { 
    var result = []; 
    if (current_string.length === actual_string.length) { 
     return [current_string]; 
    } 
    actual_string.forEach(function(currentChar, index) { 
     if (seen.indexOf(index) === -1) { 
      result = [].concat.apply(result, combinations(current_string 
       + currentChar, actual_string, seen.concat(index))); 
     } 
    }); 
    return result; 
} 

console.log(combinations("", "ABC".split(""), [])); 

輸出

[ 'ABC', 'ACB', 'BAC', 'BCA', 'CAB', 'CBA' ] 

注:這個方案的假設下工作,在輸入字符串中的字符將是獨一無二的。

有三個參數傳遞給這個函數。第一個是當前使用遞歸構建的字符串,第二個是實際字符串中的字符數組,第三個是已經在遞歸樹中看到的索引列表。

第一個if條件是此遞歸解決方案的基本條件。如果生成的當前字符串的長度等於實際字符串的長度,那麼我們沒有要處理的字符,這是其中一種組合。所以,我們返回。

如果沒有滿足這個條件,對於實際字符串中的每個字符,我們檢查它是否已被使用(我們比較索引與seen中的索引)。如果已經在當前的遞歸中使用它,那就忽略它。否則,將其與當前字符串連接並將其包含在所查看的變量中並立即執行。

遞歸的結果將是一個字符串數組。我們需要扁平它們(連接內部數組的所有元素)。所以,我們使用[].concat.apply

最後,我們回到收集的結果,這裏是遞歸樹的樣子

Combinations Recursion Tree

+2

我個人不喜歡「僅限代碼」的答案,特別是當OP似乎試圖理解某些東西時 - 而不僅僅是讓它起作用。您應該花一些精力來解釋代碼正在執行的邏輯。 – amit

+0

@amit請現在檢查,我已經包含了一個關於圖表的小解釋。 – thefourtheye

+1

我不能判斷js代碼,因爲我不熟悉它,但現在的解釋很不錯。很好的答案。 – amit