博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js 生成笛卡尔积
阅读量:6082 次
发布时间:2019-06-20

本文共 2875 字,大约阅读时间需要 9 分钟。

其实生成 笛卡尔积的方法原本很简单,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(''));               }

 

由于时间关系,比较粗糙,有不当的地方还请大家指正。

转载地址:http://mgzwa.baihongyu.com/

你可能感兴趣的文章
Android学习之BMI1.0
查看>>
PureFlex System成为IT架构优化的根基
查看>>
word精华编号篇之一自动编号
查看>>
centos 安装 nginx-mysql-redis
查看>>
C语言实现直接插入排序,冒泡排序以及二分查找(巩固理解记忆)
查看>>
sqoop相关整理记录
查看>>
Solr基础教程之Schema.xml(二)
查看>>
给控件添加长按弹出菜单(上下文菜单,又叫contextMenu)
查看>>
傻瓜式 Material Design 风格矢量图标生成器
查看>>
Nodejs创建HTTPS服务器
查看>>
ubuntu12.04 安装sublime text 2及插件。
查看>>
AFNetworking、MKNetworkKit和ASIHTTPRequest比较
查看>>
Impala 表使用 Avro 文件格式(翻译)
查看>>
http中返回错误代码的意思
查看>>
Spring – 开发环境 – 手动配置
查看>>
!==和!=有什么区别(js php)
查看>>
python入门神图
查看>>
我的友情链接
查看>>
[一文一命令]ls命令详解
查看>>
EBS FORM 失效工具栏按钮
查看>>