【032】JavaScript 计算笛卡尔积[通俗易懂]

【032】JavaScript 计算笛卡尔积[通俗易懂]这是一个用JavaScript实现笛卡尔积的例子。注意:本文中所说的集合是指数学上的集合,不是es6里的Set。整体思路如下:用户传入一个二维的数组,每个子数组都是一个要进行笛卡尔积计算的集合。返回一个二维数组,每个子数组都是一个有序对或者n元有序组。当用户传入一个集合的时候,为了兼容业务,返回形如:[[a],[b]…]的二维数组。当用户只传入两个集合计算的时候,普通的嵌套计算即可。当用

大家好,又见面了,我是你们的朋友全栈君。

这是一个用JavaScript实现笛卡尔积的例子。
注意:本文中所说的集合是指数学上的集合,不是es6里的Set。

整体思路如下:

  1. 用户传入一个二维的数组,每个子数组都是一个要进行笛卡尔积计算的集合。返回一个二维数组,每个子数组都是一个有序对或者n元有序组。
  2. 当用户传入一个集合的时候,为了兼容业务,返回形如:[[a],[b]…]的二维数组。
  3. 当用户只传入两个集合计算的时候,普通的嵌套计算即可。
  4. 当用户传入3个或者3个以上的集合的时候,先计算最后两个集合的结果,再依次把前面的集合与其进行计算。

实现代码如下:

descates.js

/**
 * Created by Hawk on 2016/6/18.
 */
var DescartesUtils = {

    /**
     * 如果传入的参数只有一个数组,求笛卡尔积结果
     * @param arr1 一维数组
     * @returns {Array}
     */
    descartes1:function(arr1){
        // 返回结果,是一个二维数组
        var result = [];
        var i = 0;
        for (i = 0; i < arr1.length; i++) {
            var item1 = arr1[i];
            result.push([item1]);
        }
        return result;
    },

    /**
     * 如果传入的参数只有两个数组,求笛卡尔积结果
     * @param arr1 一维数组
     * @param arr2 一维数组
     * @returns {Array}
     */
    descartes2: function(arr1, arr2) {
        // 返回结果,是一个二维数组
        var result = [];
        var i = 0, j = 0;
        for (i = 0; i < arr1.length; i++) {
            var item1 = arr1[i];
            for (j = 0; j < arr2.length; j++) {
                var item2 = arr2[j];
                result.push([item1, item2]);
            }
        }
        return result;
    },

    /**
     *
     * @param arr2D 二维数组
     * @param arr1D 一维数组
     * @returns {Array}
     */
    descartes2DAnd1D: function(arr2D, arr1D) {
        var i = 0, j = 0;
        // 返回结果,是一个二维数组
        var result = [];

        for (i = 0; i < arr2D.length; i++) {
            var arrOf2D = arr2D[i];
            for (j = 0; j < arr1D.length; j++) {
                var item1D = arr1D[j];
                result.push(arrOf2D.concat(item1D));
            }
        }

        return result;
    },

    descartes3: function(list) {
        var listLength = list.length;
        var i = 0, j = 0;
        // 返回结果,是一个二维数组
        var result = [];
        // 为了便于观察,采用这种顺序
        var arr2D = DescartesUtils.descartes2(list[0], list[1]);
        for (i = 2; i < listLength; i++) {
            var arrOfList = list[i];
            arr2D = DescartesUtils.descartes2DAnd1D(arr2D, arrOfList);
        }
        return arr2D;
    },

    //笛卡儿积组合
    descartes: function(list)
    {
        if (!list) {
            return [];
        }
        if (list.length <= 0) {
            return [];
        }
        if (list.length == 1) {
            return DescartesUtils.descartes1(list[0]);
        }
        if (list.length == 2) {
            return DescartesUtils.descartes2(list[0], list[1]);
        }
        if (list.length >= 3) {
            return DescartesUtils.descartes3(list);
        }
    }

};

descartes.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript" src="descartes.js"></script>
</head>
<body>


<div id="resultDiv"></div>
<script type="text/javascript">
    var arr1 = [1,2,3];
    var arr2 = ["a", "b", "c", "d"];
    var list = [arr1, arr2];
    var list2 = [
        [1,2,3],
        ["a", "b", "c"],
        ["A", "B"],
        ["啊","把","车","的"]
    ];
    var result = DescartesUtils.descartes(list2);

    var html = "";
    for (var i = 0; i < result.length; i++) {
        html = html + result[i].join(",") + "<br>";
    }
    document.getElementById("resultDiv").innerHTML = html;
</script>
</body>
</html>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157587.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Flask表单提交的方法[通俗易懂]

    Flask表单提交的方法[通俗易懂]这里介绍一下Flask表单提交相关的方法,还是以代码实例为主。首先,Flask模板中表单提交代码与我们一般写的H5表单无异,当然,Flask也提供了表单类,Flask-WTF扩展。这里只介绍常规的表单提交方法。首先是模板类:&lt;!DOCTYPEhtml&gt;&lt;htmllang="en"&gt;&lt;head&gt;&lt;metacharset="UTF-8"&g…

    2025年12月4日
    3
  • Paxos算法详解

    Paxos算法详解Paxos、Raft分布式一致性算法应用场景一文讲述了分布式一致性问题与分布式一致性算法的典型应用场景。作为分布式一致性代名词的Paxos算法号称是最难理解的算法。本文试图用通俗易懂的语言讲述Paxos算法。Paxos算法是Lamport宗师提出的一种基于消息传递的分布式一致性算法,使其获得2013年图灵奖。Paxos由Lamport于1998年在《ThePart-TimeParliament》论文中首次公开,最初的描述使用希腊的一个小岛Paxos作为比喻,描述了Paxos小岛中通过决议的流程,并以此命

    2025年7月28日
    2
  • Win10 IIS Web服务器安装与配置

    Win10 IIS Web服务器安装与配置这几天课程实训,使用IIS配置服务器,课本上内容太久,老师也没有讲过,自己摸索了一下,所以记录一下安装IIS打开程序和功能,选择左边启用或关闭Windows功能,建议根据下图勾选,确定后等待安装完成打开IIS直接使用Cortana搜索管理工具,打开选择InternetinformationServices(IIS)管理器点击左边栏,在计算机名下,网站文件夹下已经默认存

    2022年5月30日
    42
  • Linux 文件系统与日志分析「建议收藏」

    Linux 文件系统与日志分析「建议收藏」文章目录1.前言2.深入理解Linux文件系统2.1inode与block详解(1)inode和block概述1.前言2.深入理解Linux文件系统2.1inode与block详解(1)inode和block概述  文件是存储在硬盘上的,硬盘的最小存储单位叫做“扇区”(sector),每个扇区存储512字节。一般连续八个扇区组成一个“块”(block),一个块是4K大小,是文件存取的最小单位。操作系统读取硬盘的时候,是一次性连续读取多个扇区

    2022年5月9日
    47
  • mysql hibernate mediumtext_mysql中的text,mediumtext,longtext在Hibernate中的類型映射 | 學步園…

    mysql hibernate mediumtext_mysql中的text,mediumtext,longtext在Hibernate中的類型映射 | 學步園…(摘自http://congpeixue.iteye.com/blog/283402)在Hibernate的配置中,我目前是採用Annotation的方式,不過原理應該都一樣。對於如下的屬性:privateStringdtaContent;@Lob(type=LobType.CLOB,fetch=FetchType.LAZY)@ColumnpublicStringgetDtaCo…

    2022年5月8日
    33
  • Excel之VBA简单宏编程

    Excel之VBA简单宏编程Excel之VBA简单宏编程excel是一款很经典的数据分析的工具,里面包含了很多内置函数,但实际情况有时却复杂得多,而excel的宏编程提供了自定义函数的功能,正好有老师需要帮忙做一些数据分析,就学习了一下,下面是我的学习笔记。本人使用的是excel2013。有出入的地方可以参考。Excel之VBA简单宏编程1、准备工作2、VBA编程2.1模块声明2.2变量声明及赋值2…

    2022年6月13日
    87

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号