js 排列 組合 的一個簡單例子

來源:互聯網
上載者:User

標籤:單例   array   工作項目   splice   簡單   處理   function   app   插入   

最近工作項目需要用到js排列組合,於是就寫了一個簡單的demo。 前幾天在網上找到一個寫全排列A(n,n)的code感覺還可以,於是貼出來了,

排列的實現方式: 全排列主要用到的是遞迴和數組的插入 比如12的全排列,首先把1拿出來放到elementCur,再擷取由1組成的數組[2],然後在迴圈把1插入到0,1的位置後再返回1,2][2,1] 如果是123那麼首先擷取23的全排列[2,3][3,2],然後在插入1,[1,2,3][2,1,3][2,3,1][1,3,2][3,1,2][3,2,1] 

  /*        全排列主要用到的是遞迴和數組的插入        比如12的全排列,首先把1拿出來放到elementCur,再擷取由1組成的數組[2],然後在迴圈把1插入到0,1的位置後再返回1,2][2,1]        如果是123那麼首先擷取23的全排列[2,3][3,2],然後在插入1,[1,2,3][2,1,3][2,3,1][1,3,2][3,1,2][3,2,1]        */        function permutate(array/*需要進行全排列的一維數組*/, permutatedArray/*存放返回結果*/) {            if (!permutatedArray) {                permutatedArray = [];            }            if (array.length > 1) {                //彈出第一個數                var elementCur = array.shift();                //排列剩餘的數組                permutate(array, permutatedArray);                //返回剩餘的數組的排列長度                var permutatedArrayLen = permutatedArray.length;                //第一個數與其他剩餘數組所有數組組合                for (var j = 0; j < permutatedArrayLen; j++) {                    //彈出不齊的組                    var p = permutatedArray.shift();                    //把當前元素放到排列好的數組的所有位置                    for (var i = 0; i <= p.length; i++) {                        //複製排列好的數組                        var r = p.slice(0);                        //插入資料到數組的位置                        r.splice(i, 0, elementCur);                        //儲存                        permutatedArray.push(r)                    }                }                //允出準則            } else {                permutatedArray.push([array[0]]);            }            return permutatedArray;        }

那麼我們需要一個組合C(m,n)的API,code如下,組合實現的原理非常簡單,就是依次迴圈數組的元素,迴圈的嵌套層數是有m來決定的,內部的迴圈下標在外部的下標加1。所以用function來組裝

  /*        組合實現的原理非常簡單,就是依次迴圈數組的元素,迴圈的嵌套層數是有m來決定的,內部的迴圈下標在外部的下標加1。所以用function來組裝        */        function combination(arr/*n需要組合的一維數組*/, num/*m需要取幾個元素來組合*/, fun/*對組合後的元素的處理函數,如全排列permutate*/) {            /*這裡假設num最大值為10 一般A(n,m)中的m應該不會太大 */            if (arr.length < num || num > 10)            {                return [];            }            var variable = ["a", "b", "c", "d", "e", "f", "g", "h", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u"];            var replaceStr = "#$#";            var str = " var arr=arguments[0]; var fun=arguments[1];  var ret=[]; for (var a = 0; a < arr.length; a++) { "+replaceStr+" } return ret;"            for (var i = 1; i < num; i++) {                str = str.replace(replaceStr, " for (var " + variable[i] + " =" + variable[i - 1] + "+ 1; " + variable[i] + " < arr.length; " + variable[i] + "++) { " + replaceStr + "  }")            }            var temp = " var temp= []; ";            for (var i = 0; i < num; i++) {                temp += "temp.push(arr[" + variable[i] + "]); ";            }            if (fun) {                temp += " ret.push(fun(temp)); ";            }            else {                temp += " ret.push(temp); ";            }            str = str.replace(replaceStr, temp);            //console.log(str);            return (new Function(str)).apply(null, [arr, fun]);        }

那麼我們一個普通的排列A(n,m)就很簡單了。調用方式如下:

 var a = combination([1, 2, 3, 4, 5, 6], 3, permutate);        for (var i = 0; i < a.length; i++) {            for (var j = 0; j < a[i].length; j++) {                console.log(a[i][j].join(‘‘));            }        }

 有不當的地方還請大家指正!

js 排列 組合 的一個簡單例子

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.