数据排列组合问题

li190 2003-12-25 09:44:16
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 3 1
4 2 1
3 2 1

看到一本书上用递归法的程序如下:

#include <stdio.h>

//递归法
void comb( int n, int r )
{
int i;

for( i = n; i >= r; i-- )
{
//看不明白这一段,k如何在外部定义?
if(( i != n) && ( k != r )) //k为过程外定义的
{
int temp;
for( temp = 1; temp <= ( k - r ) * 3; temp++ )
printf(" ");
}

printf(" %3d", i );

if( r > 1 )
comb( i - 1, r - 1 ); //递推到i-1个数
else
printf(" \n");
}
}

main()
{
comb( 5, 3 );
}
...全文
37 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
li190 2003-12-25
  • 打赏
  • 举报
回复
#include <stdio.h>

int k; //全局变量,保存最原始的每行个数r(不是迭代过程中的)

//递归法
void comb( int n, int r )
{
int i;

for( i = n; i >= r; i-- )
{
//打印和上一行相同部分的位置为空格
if(( i != n) && ( k != r )) //k为过程外定义的
{
int temp;
for( temp = 1; temp <= ( k - r ) * 3; temp++ )//这里的3是对应的printf("%3d", i );中的3
printf(" ");
}

printf("%3d", i );

if( r > 1 )
comb( i - 1, r - 1 ); //递推到i-1个数
else
printf(" \n");
}
}

main()
{
int a, b;
scanf( "%d %d", &a, &b );

k = b;
comb( a, b );
}
li190 2003-12-25
  • 打赏
  • 举报
回复
原书上就是给出这样的程序片断,我想完善却找不到"门",所以上来请大家帮忙的。
quick3210 2003-12-25
  • 打赏
  • 举报
回复
void comb( int n, int r )
{
int i;

for( i = n; i >= r; i-- )
{
if(( i != n) && ( k != r )) //这里的大概意思是在确定了r个数的最高位上的
//数之后继续推出第r-1位上的数,不过你最好能
//把k的定义给出来
{
int temp;
for( temp = 1; temp <= ( k - r ) * 3; temp++ )
printf(" ");
}

printf(" %3d", i );

if( r > 1 )
comb( i - 1, r - 1 ); //递推到i-1个数
else
printf(" \n");
}
}

69,371

社区成员

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

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