javascript實現組合的遞迴演算法及變種

來源:互聯網
上載者:User

    實現某數組的組合演算法有很多種,其中以遞迴為最多,而且網上不乏高效率的樣本,這裡只示範一種實現方式.

 

代碼

 1     /**
 2      * 遞迴組合
 3      * 從 arr[1n] 中任選 num(0 < num <= n) 個數的所有組合
 4      */
 5     function combine(arr, num) {
 6         var r = [];
 7         (function f(t, a, n) {
 8             if (n == 0) return r.push(t);
 9             for (var i = 0, l = a.length; i <= l - n; i++) {
10                 f(t.concat(a[i]), a.slice(i + 1), n - 1);
11             }
12         })([], arr, num);
13         return r;
14     }
15      
16     /** 測試代碼 **/
17     combine([1,2,3,4,5,6,7,8,9], 3);

    然而,事情並不是都這麼簡單,現在遇到一個新問題,我定義了一個新的數組

    var arr = [[1,2,3],

                   [1,2,3,4,5],

                   [2,4,6,8],

                   [3,5,7,9]];

    要求是從數組arr的每個元素中任意取一個值出來,組成一個長度為4(即arr.length)的組合,求有多少種組合方式.這個時候,如果想要再次利用上面的遞迴,就需要改造一下了.主要變化就是在每次傳入匿名函數的參數上,以保證每次要迴圈的數組是arr的下一個元素而不是當前元素本身.

 

代碼

 1 function combine_ex(arr) {
 2     var r = [];
 3     (function f(t, a, n) {
 4         if (n == 0) return r.push(t);
 5         for (var i = 0; i < a[n-1].length; i++) {
 6             f(t.concat(a[n-1][i]), a, n - 1);
 7         }
 8     })([], arr, arr.length);
 9     return r;
10 }

    接著就有新問題了,如果要對上面變長的二維數組,要求是從數組arr的每個元素中任意取一個值出來,組成一個長度為指定任意值的組合怎麼辦?要說辦法也就在這裡了,無非就是將前面兩種函數一起使用,先求出最長組合的集合,然後對每一個元素求指定長度的組合.

    總歸,組合演算法的需求是多樣的,不管怎麼變,都能從最基本的演算法進行衍變,派生出複合的演算法出來.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.