(选排列)下面程序的功能是利用递归方法生成从 1 到
(选排列)下面程序的功能是利用递归方法生成从 1 到 n(n<10)的 n 个数中取 k(1<=k<=n)个数的 全部可能的排列(不一定按升序输出)。
例如,当 n=3,k=2 时, 应该输出(每行输出 5 个排列):
12 13 21 23 32
31
程序:
#include <stdio.h>
int n,k,a[10];
long count=0;
void perm2(int j)
{
int i,p,t;
if( ① )
{
for(i=k;i<=n;i++)
{
count++;
t=a[k]; a[k]=a[i]; a[i]=t;
for( ② )
printf("%1d",a[p]); /* "%1d" 中是数字 1,不是字母 l */
printf(" ");
t=a[k];a[k]=a[i];a[i]=t;
if(count%5==0) printf("\n");
}
return;
}
for(i=j;i<=n;i++)
{
t=a[j];a[j]=a[i];a[i]=t;
③ ;
t=a[j]; ④ ;
}
}
int main()
{
int i;
printf("\nEntryn,k (k<=n):\n");
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++) a[i]=i;
⑤ ;
}答案
第1空:j=k / k=j
第2空:p:=1 to k
第3空:perm2(j+1)
第4空:a[j]:=a;a:=t
第5空:perm2(1)