全组合的递归实现(ruby)

着急用所以直接扒了一个C++算法翻译成了ruby…暂记

 1 nodes = ["node1", "node2", "node3", "node4", "node5", "node6"]
 2
 3 def combine_array(arr, start, index, count, num ,len, output)
 4     for i in (start..len-1)
 5       index[count-1] = i
 6       if count-1 == 0 then
 7         out = []
 8         for j in (0..num-1)
 9         out << arr[index[j]]
10         end
11         #puts "#{out}"
12         #puts "------------"
13         output << out
14       else
15         combine_array(arr, i+1, index, count-1, num, len, output)
16       end
17    end
18 end
19
20 for i in (1..6)
21   outs = []
22   combine_array(nodes, 0, index, i, i, len, outs)
23   p outs
24   puts "------------"
25 end
时间: 2024-08-25 13:12:35

全组合的递归实现(ruby)的相关文章

递归求解几类排列组合问题(二、全组合排列)

对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. Sample Input 3 1 2 3 Sample Output 123 132 213 231 312 321 #include<stdio.h> #include<strin

字符串的全组合

大家千万不要把全组合和全排列搞混了,给定一个字符串:abc, 全组合形式:a,b,c,ab,ac,bc,abc 全排列形式:abc,acb,bac,bca,cab,cba 下面我就讲一下全组合问题. 首先讲一下组合问题原理: n个元素选m个元素的组合问题的实现. 从后往前选取, 选定位置i后, 再在前i-1个里面选取m-1个. * 如: 1, 2, 3, 4, 5 中选取3个元素. * 1) 选取5后, 再在前4个里面选取2个, 而前4个里面选取2个又是一个子问题, 递归即可; * 2) 如果不

常见算法之全排列 全组合

全排列算法是一种比较常考的算法,他的做法也比较多样. 首先我们来看看最符合我们直观思考的,思路是这样的:假如没有重复元素时,传入一个数组A,并插入到另外一个数组B中,假如B中已经包含这个元素,则跳过,否则插入数组B.我们来看看具体代码: <span style="font-size:14px;">public static void permutation1(final String str, String buffer){ if (str.length() == buff

全排列和全组合实现

记得@老赵之前在微博上吐槽说,“有的人真是毫无长进,六年前某同事不会写程序输出全排列,昨天发邮件还是问我该怎么写,这时间浪费到我都看不下去了.” 那时候就很好奇全排列到底是什么东西,到底有多难? 今天复习的时候终于碰到这题了,结果果然自己太渣,看了好久都没明白,代码实现又是磕磕碰碰的.所以,就把它整理成笔记加深记忆,也希望能帮到和我一样的人. 全排列 所谓全排列,就是打印出字符串中所有字符的所有排列.例如输入字符串abc,则打印出 a.b.c 所能排列出来的所有字符串 abc.acb.bac.b

搜索入门练习题3 全组合 题解

题目出处:<信息学奥赛一本通>例5.2. 题目描述 设有 \(n\) 个数的集合 \(\{1,2,...,n\}\) ,从中任意取出 \(r\) 个数进行排列 \((r \le n)\) ,试列出所有的排列. 输入格式 输入包含两个正数 \(n,r(1 \le r \le n \le 10)\) 输出格式 输出从 \(n\) 个数的集合中选出 \(r\) 个数的所有组合,每个组合方案占一行.对于每个组合,按照从小到大的顺序输出组合中的所有元素,两两之间有一个空格分隔. 样例输入 3 2 样例输

剑指offer-拓展训练-字符的所有组合-全组合

/* 题目: 给定不含重复字符字符串的全组合. */ /* 思路: 递归法. 例给定abc,输出的组合长度为1,2,3. 对于长度为2的组合,分选择a(ab,ac)和不选择a的情况(bc). 选择a,则在剩余字符串中选择长度为1的字符组合: 不选择a,则在剩余字符串中选择长度为2的字符组合. */ #include<iostream> #include<stdio.h> #include<string> using namespace std; string curr;

排列组合的递归

令E={e1,e2,-,en}表示n个元素的集合,:Ei为E中移去元素ei后的集合,perm(X)表示集合X中元素的排列方式.Ei*perm(X)表示在集合X的每个排列方式的前面都加上ei后所得的排列方式. 则集合E的排列组合等于: n= 1;perm(E) = {e1}; n> 1;perm(E) = e1*perm(E1)+e2*perm(E2)+--+en*perm(En); #include<iostream> #include<vector> #include<

算法:全组合算法

public static List<int[]> combin(final int TOTAL, final int SELETED) { List<int[]> list = new ArrayList<int[]>(400000); int[] i = new int[SELETED]; for (int x = 1; x <= SELETED; x++) i[x - 1] = x; final int LAST = SELETED - 1; while (

全组合算法

//全组合算法        public static List<List<T>> FullCombination<T>(List<T> lstSource)        {            var n = lstSource.Count;            var max = 1 << n;            var lstResult = new List<List<T>>();