返回信息流比如输入10,则可列出{1,2,3,。。。,10}的子集。。
多谢解答,^_^
这是一条镜像帖。来源:北邮人论坛 / cpp / #37486同步于 2010/4/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[求助]递归求子集问题
spirit152
2010/4/6镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
哎哟,这不是高老师的著名论文嘛。TAOCP第四卷有解。
放个老土的办法(不递归)
void print_ziji(n) {
for(int i=0;i<(1<<n);i++) {
for(j=0;j<n;j++) {
if(((1<<j)&i)!=0) printf("%d",j+1);
}
printf("\n");
}
}
拼音函数名XD
【 在 wks (cloverprince) 的大作中提到: 】
: 哎哟,这不是高老师的著名论文嘛。TAOCP第四卷有解。
: 放个老土的办法(不递归)
: void print_ziji(n) {
: ...................
不过……学长看TAOCP啊……看完了吗……
【 在 wks (cloverprince) 的大作中提到: 】
: 哎哟,这不是高老师的著名论文嘛。TAOCP第四卷有解。
: 放个老土的办法(不递归)
: void print_ziji(n) {
: ...................
// C/C++语言太难叙述了。
// 这是C语言:
#include<stdio.h>
#define VERY_BIG 256
void dayin_ziji_recursive(int nums[], int sz, int first, int stack[], int stacksize)
{
int i;
if(first==sz) {
for(i=0;i<stacksize;i++) printf("%d ",stack[i]);
printf("\n");
} else {
dayin_ziji_recursive(nums,sz,first+1,stack,stacksize);
stack[stacksize]=nums[first];
dayin_ziji_recursive(nums,sz,first+1,stack,stacksize+1);
}
}
void dayin_ziji(int nums[], int sz) {
int ziji[VERY_BIG];
dayin_ziji_recursive(nums, sz, 0, ziji, 0);
}
int main() {
int shuzi[]={1,2,3,4,5};
dayin_ziji(shuzi,5);
return 0;
}
-- 作为参考,这是haskell语言。
allSubSets lst = case lst of
[] -> [[]]
(x:xs) -> [x:other | other <- (allSubSets xs)] ++ (allSubSets xs)
-- 或者更简练的:
import Data.Maybe
ass2 lst = map catMaybes $ sequence $ map (\x -> [Nothing, Just x]) $ lst
没有递归,很原始啦
int main()
{
int n,total,i,j,k,tmp;
int a[max]={0};
scanf("%d",&n);
total=(int)pow(2,n);
for(i=0;i<total;i++)
{
j=0;
tmp=i;
while(tmp!=0)
{
a[j]=tmp%2;
tmp=tmp>>1;
j++;
}
for(k=0;k<n;k++)
{
if(a[k]!=0)
printf("%d ",k+1);
}
printf("\n");
}
return 0;
}