递归实现组合问题

laiben 2003-09-14 09:24:26
用递归,从自然数1,2,...,n中任取r个数的所有组合。如n=5,r=3,程序结果如下
5 4 3
5 4 2
5 4 1
5 3 2
5 3 1
5 2 1
4 3 2
4 2 1
3 2 1

以下程序在TURBOC2.0运行后不能得出以上结果,请问错在哪?
#include <stdio.h>
#define N 30
int a[N];


void comb(int n,int k)
{int i,j;
for(i=n;i>=k;i--)
{a[k]=i;
if(k>1) comb(n-1,k-1);
else { for(j=a[0];j>0;j--)
printf("%4d",a[j]);
printf("\n");
}
}
}

void main()
{int i,r;
i=5;r=3;
a[0]=r;
comb(i,r);printf("\n\n");
}
...全文
70 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
laiben 2003-10-13
  • 打赏
  • 举报
回复
前阵子比较忙,不好意思啊,谢谢你们!
wgzh 2003-09-18
  • 打赏
  • 举报
回复
问题解决了,赶紧结帖啊,兄弟~
laiben 2003-09-17
  • 打赏
  • 举报
回复
感谢火鸟!
wgzh 2003-09-16
  • 打赏
  • 举报
回复
void comb(int n,int k)
{int i,j;
for(i=n;i>=k;i--)
{a[k]=i; //问题出在当程序回嗍时,此处重复赋相同值
if(k>1) comb(n-1,k-1);
else { for(j=a[0];j>0;j--)
printf("%4d",a[j]);
printf("\n");
}
}
}

改为下面就可以了:
void comb(int n,int k)
{int i,j;

for(i=n;i>=k;i--)
{
if( ( k < a[0] ) && ( i >= a[k+1] ) )
continue;
a[k]=i;
if(k>1) comb(n-1,k-1);
else { for(j=a[0];j>0;j--)
printf("%4d",a[j]);
printf("\n");
}
}
}

laiben 2003-09-15
  • 打赏
  • 举报
回复
自己up!
ttlb 2003-09-14
  • 打赏
  • 举报
回复
帮你up
pzytony 2003-09-14
  • 打赏
  • 举报
回复

up
laiben 2003-09-14
  • 打赏
  • 举报
回复
类似问题:
#include <stdio.h>
#define N 30
int a[N],r;
void print()
{int i;
for(i=0;i<r;i++)
printf("%3d",a[i]);
printf("\n");
}

void comb(int n,int k)
{int i;
for(i=n;i>=k;i--)
{a[k-1]=i;
if(k>1) comb(i-1,k-1);
else print();
}
}

void main()
{int i;
r=3;
for(i=5;i<8;i++)
{comb(i,r);printf("\n\n");
}
}
laiben 2003-09-14
  • 打赏
  • 举报
回复
自己up
help 啊~

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧