js 生成笛卡爾積


其實生成 笛卡爾積的方法原本很簡單,for循環就可以了,

  function discarts() {
            //笛卡爾積
            var twodDscartes = function (a, b) {
                var ret = [];
                for (var i = 0; i < a.length; i++) {
                    for (var j = 0; j < b.length; j++) {
                        ret.push(ft(a[i], b[j]));
                    }
                }
                return ret;
            }
            var ft = function (a, b) {
                if (!(a instanceof Array))
                    a = [a];
                var ret = a.slice(0);
                ret.push(b);
                return ret;
            }
            //多個一起做笛卡爾積
            return (function (data) {
                var len = data.length;
                if (len == 0)
                    return [];
                else if (len == 1)
                    return data[0];
                else {
                    var r = data[0];
                    for (var i = 1; i < len; i++) {
                        r = twodDscartes(r, data[i]);
                    }
                    return r;
                }
            })(arguments.length > 1 ? arguments : arguments[0]);
        }

調用方式:

 var a = discarts([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
        var a = discarts([['a', 'b', 'c'], [1, 2, 3, 4], ['A', 'B'], ['#', '@', '+'], ['Mary', 'Terry', 'KYO']]);

缺點:

.在有些時候我們需要返回的是一個迭代器,比如要生成10000號碼,discarts已經循環了10000次,如果業務需要對着10000個號碼需要過濾,那么還需要循環10000次,這樣可是不行的哦

那么修改后的code如下:

 this.combins = function () {
            if (arguments.length < 2) return arguments[0] || [];
            var args = Array.prototype.slice.call(arguments);
            var that = {
                index: 0,
                nth: function (n) {
                    var result = [],
                        d = 0;
                    for (; d < this.dim; d++) {
                        var l = this[d].length;
                        var i = n % l;
                        result.push(this[d][i]);
                        n -= i;
                        n /= l;
                    }
                    return result;
                },
                next: function () {
                    if (this.index >= size) return;
                    var result = this.nth(this.index);
                    this.index++;
                    return result;
                }
            };
            var size = 1;
            for (var i = 0; i < args.length; i++) {
                size = size * args[i].length;
                that[i] = args[i];
            }
            that.size = size;
            that.dim = args.length;
            return that;
        }

調用code:

   var a = combins([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
        var index = 0;
        while (c = a.next()) {
            index++;
            console.log(index+1+":"+c.join(''));       
        }

 

由於時間關系,比較粗糙,有不當的地方還請大家指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM