zoukankan      html  css  js  c++  java
  • <经验杂谈>介绍Js简单的递归排列组合

    最近在开发SKU模块的时候,遇到这样一个需求,某种商品有N(用未知数N来表示是因为规格的数组由用户制定且随时可以编辑的,所以对程序来说,它是一个未知数)类规格,每一类规格又有M个规格值,各种规格值的组合便是一个型号,比如说,颜色是商品规格的一类,可能的值有红、黄、蓝,而尺码是另一类规格,可能的取值有L、M。那它们的规格组合数为:3*2 = 6,如果再另一类规格是版型,分别为修身和宽松,那就有4 * 2 * 2 = 16种组合了。怎样简单高效地求出这些组合呢?

    这类问题首先考虑的方法是用递归,但返回之间并没有相互依赖的关系,到底什么时候结束是个问题,用嵌套的循环又会由于数组的维度及深度不得而知而变得困难重重,后来想到使用的是js进行函数递归调用,算法比之前的要精妙很多,用的是函数的递归  而非简单的嵌套for循环,以下看下代码:

    function combine(arr) {  
                    var r = [];  
                    (function f(t, a, n) {  
                        if (n == 0) return r.push(t);  
                        for (var i = 0; i < a[n-1].length; i++) {  
                            f(t.concat(a[n-1][i]), a, n - 1);  
                        }  
                    })([], arr, arr.length);  
                    return r;  
                }  
                var arr = [  
                    ['1','2', '3'],  
                    ['a','b', 'c'],  
                    ['x','y','z'],  
                    ['e','f','g','h', 'i']];  
                var res = combine(arr); 

    这是一个对数组进行排列组合的js demo。

  • 相关阅读:
    Fedora下使用minicom及USB串口线
    fedora装机后要运行的脚本(原创)
    终极 Shell
    深入学习 Git 工作流
    如何使用Git上传项目代码到github
    Fedora23 chrome 安装
    Fedora下安装deb包方法
    vim自动缩进设置
    Fedora 20 安装搜狗拼音输入法
    C语言stat()函数:获取文件状态
  • 原文地址:https://www.cnblogs.com/benpao/p/7574904.html
Copyright © 2011-2022 走看看