编程求打印N个元素中取M个的全组合(不限语言C/C++,Java,PHP,Python,Js,C#,VB,Perl,Ruby)
样例输入32#3个元素取2个123#3个数据样例输出121323==========样例输入33#3个元素取3个123#3个数据样例输出123==========样例输入...
样例输入
3 2 #3个元素取2个
1 2 3 #3个数据
样例输出
1 2
1 3
2 3
==========
样例输入
3 3 #3个元素取3个
1 2 3 #3个数据
样例输出
1 2 3
==========
样例输入
3 1 #3个元素取1个
1 2 3 #3个数据
样例输出
1
2
3
强调,是组合不是排列,不允许重复组合..
任一语言的实现 展开
3 2 #3个元素取2个
1 2 3 #3个数据
样例输出
1 2
1 3
2 3
==========
样例输入
3 3 #3个元素取3个
1 2 3 #3个数据
样例输出
1 2 3
==========
样例输入
3 1 #3个元素取1个
1 2 3 #3个数据
样例输出
1
2
3
强调,是组合不是排列,不允许重复组合..
任一语言的实现 展开
1个回答
展开全部
楼主会那么多语言呀,真是厉害,佩服,佩服。
其实用递归的方法来做组合还是比较简单的,下面是用PHP写的例子程序:
<?php
$arr=array('a','b','c','d','e');
show_comb($arr,'',3);
function show_comb($arr,$head,$n){
//echo '"',$head,'",(',implode(',',$arr),'),',$n,"\n";//输出调用信息
if (count($arr)<$n || $n==0) return;
elseif ($n==1) foreach ($arr as $v) echo "$head $v <br>\n";
else {
foreach ($arr as $k=>$v){
array_shift($arr);
if (count($arr)>=$n-1) show_comb($arr,"$head $v",$n-1);
}
}
}
?>
说明一,写万了才发现没有完全按照你的要求,没有写输入、输出部分,主程序直接定义数组,然后调用组合函数显示从这个数组里面取出n个数的组合并显示,核心的算法是那个函数。
说明二,我为什么选用PHP语言来写代码呢,因为PHP的程序可以作为算法的描述,看明白了这个代码,你用什么语言都可以编写了,只是用传统高级语言(例如C)的时候要小心处理从数组里面移出一个元素等算法。
说明三,显示组合函数的逻辑
形参说明:函数show_comb($arr,$head,$n)的三个参数,参数$arr是含有M个元素的数组,参数$n是从里面取多少个数来进行组合,参数$head表述输出组合的时候,每一行的前面增加一个串。
逻辑说明:
如果数组$arr的元素个数小于要取的个数$n,那么调用无效,直接返回;
如果是从数组$arr里面取1个数来进行组合,那么就循环显示数组的每个元素,完毕后返回;
如果是从数组$arr里面取多个数来进行组合,(关健点)那么就循环数组的每一个元素,把取出的元素作为$head头、从数组中移出这个元素、在剩余数组里面取$n-1个数进行组合(递归)。
其实用递归的方法来做组合还是比较简单的,下面是用PHP写的例子程序:
<?php
$arr=array('a','b','c','d','e');
show_comb($arr,'',3);
function show_comb($arr,$head,$n){
//echo '"',$head,'",(',implode(',',$arr),'),',$n,"\n";//输出调用信息
if (count($arr)<$n || $n==0) return;
elseif ($n==1) foreach ($arr as $v) echo "$head $v <br>\n";
else {
foreach ($arr as $k=>$v){
array_shift($arr);
if (count($arr)>=$n-1) show_comb($arr,"$head $v",$n-1);
}
}
}
?>
说明一,写万了才发现没有完全按照你的要求,没有写输入、输出部分,主程序直接定义数组,然后调用组合函数显示从这个数组里面取出n个数的组合并显示,核心的算法是那个函数。
说明二,我为什么选用PHP语言来写代码呢,因为PHP的程序可以作为算法的描述,看明白了这个代码,你用什么语言都可以编写了,只是用传统高级语言(例如C)的时候要小心处理从数组里面移出一个元素等算法。
说明三,显示组合函数的逻辑
形参说明:函数show_comb($arr,$head,$n)的三个参数,参数$arr是含有M个元素的数组,参数$n是从里面取多少个数来进行组合,参数$head表述输出组合的时候,每一行的前面增加一个串。
逻辑说明:
如果数组$arr的元素个数小于要取的个数$n,那么调用无效,直接返回;
如果是从数组$arr里面取1个数来进行组合,那么就循环显示数组的每个元素,完毕后返回;
如果是从数组$arr里面取多个数来进行组合,(关健点)那么就循环数组的每一个元素,把取出的元素作为$head头、从数组中移出这个元素、在剩余数组里面取$n-1个数进行组合(递归)。
追问
写那些语言是为了让更多的人收到题,是功能性字样。
很早以前也是这么想昨天突然忘了,
昨天我已回想出来,算法和你这个差不多了。多写2遍也许就记住了。
http://zhidao.baidu.com/question/357232953.html
看了你也是自己想的,不错,支持原创吧。。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询