当前位置: 首页 > news >正文

javascript实现组合的递归算法及变种

    实现某数组的组合算法有很多种,其中以递归为最多,而且网上不乏高效率的示例,这里只演示一种实现方式.

 

代码
 1       /* *
 2       * 递归组合
 3       * 从 arr[1n] 中任选 num(0 < num <= n) 个数的所有组合
 4        */
 5       function  combine(arr, num) {
 6           var  r  =  [];
 7          ( function  f(t, a, n) {
 8               if  (n  ==   0 return  r.push(t);
 9               for  ( var  i  =   0 , l  =  a.length; i  <=  l  -  n; i ++ ) {
10                  f(t.concat(a[i]), a.slice(i  +   1 ), n  -   1 );
11              }
12          })([], arr, num);
13           return  r;
14      }
15       
16       /* * 测试代码 * */
17      combine([ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ],  3 );

    然而,事情并不是都这么简单,现在遇到一个新问题,我定义了一个新的数组

    var arr = [[1,2,3],

                   [1,2,3,4,5],

                   [2,4,6,8],

                   [3,5,7,9]];

    要求是从数组arr的每个元素中任意取一个值出来,组成一个长度为4(即arr.length)的组合,求有多少种组合方式.这个时候,如果想要再次利用上面的递归,就需要改造一下了.主要变化就是在每次传入匿名函数的参数上,以保证每次要循环的数组是arr的下一个元素而不是当前元素本身.

 

代码
 1  function  combine_ex(arr) {
 2       var  r  =  [];
 3      ( function  f(t, a, n) {
 4           if  (n  ==   0 return  r.push(t);
 5           for  ( var  i  =   0 ; i  <  a[n - 1 ].length; i ++ ) {
 6              f(t.concat(a[n - 1 ][i]), a, n  -   1 );
 7          }
 8      })([], arr, arr.length);
 9       return  r;
10  }

    接着就有新问题了,如果要对上面变长的二维数组,要求是从数组arr的每个元素中任意取一个值出来,组成一个长度为指定任意值的组合怎么办?要说办法也就在这里了,无非就是将前面两种函数一起使用,先求出最长组合的集合,然后对每一个元素求指定长度的组合.

    总归,组合算法的需求是多样的,不管怎么变,都能从最基本的算法进行衍变,派生出复合的算法出来.

转载于:https://www.cnblogs.com/BeanHsiang/archive/2009/11/29/1613155.html

相关文章:

  • 汇报方案
  • [转]深一层看依赖注入
  • C# 中的委托和事件 copyright http://www.cnblogs.com/JimmyZhang
  • Week Function
  • China MVP Open Day 2009
  • C# Windows Form 刷新父窗体
  • Linq to XML说法——(二)更新,删除,加载
  • 如果可以忘记
  • C#数据库编程
  • net framework3.5新特性1:Lambda表达式
  • ghost误操作
  • 快速实现ARM和DSP的通信和协同工作(四)
  • 什么是CMS
  • 修改Oracle数据库的字符集
  • sizeof和strlen(转)
  • (三)从jvm层面了解线程的启动和停止
  • Android框架之Volley
  • canvas 五子棋游戏
  • CentOS从零开始部署Nodejs项目
  • es6要点
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Protobuf3语言指南
  • Redis中的lru算法实现
  • tweak 支持第三方库
  • VUE es6技巧写法(持续更新中~~~)
  • vuex 笔记整理
  • 从伪并行的 Python 多线程说起
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 深度学习中的信息论知识详解
  • 事件委托的小应用
  • 听说你叫Java(二)–Servlet请求
  • 智能合约Solidity教程-事件和日志(一)
  • 函数计算新功能-----支持C#函数
  • ${factoryList }后面有空格不影响
  • (剑指Offer)面试题34:丑数
  • (四)JPA - JQPL 实现增删改查
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)WLAN定义和基本架构转
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • ***详解账号泄露:全球约1亿用户已泄露
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 动态调用WebService + WSE + UsernameToken
  • .netcore如何运行环境安装到Linux服务器
  • .net打印*三角形
  • @ComponentScan比较
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • []指针
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作
  • [C++核心编程](四):类和对象——封装
  • [cocos2d-x]关于CC_CALLBACK
  • [dfs搜索寻找矩阵中最长递减序列]魔法森林的秘密路径