输出n个数字的全排列,关于代码的解释。比如n=3,执行第一次我明白输出123,但第二次之后呢?

#include<stdio.h>
#include<stdlib.h>
int a[10],book[10],n;
void adf(int step)
{
int i;
if(step==n+1)
{
for(i=1;i<=n;i++)
printf("%d",a[i]);

printf("\n");
return;
}
for(i=1;i<=n;i++)
{
if(0==book[i])
{
a[step]=i;
book[i]=1;
adf(step+1);
book[i]=0;
}
}
}
int main(){
scanf("%d",&n);
adf(1);
// printf("%d",s);
system("pause");
return 0;
}
第一次执行完return回到adf(step+1)这,具体接下来是怎么样的,能帮我说一下132是怎么排出来的么,具体此时的执行过程,谢谢!

for(i=1;i<=n;i++)

 {  

  if(0==book[i]) 

  {  

   a[step]=i; 

   book[i]=1; 

   adf(step+1);

   book[i]=0;    
 /* å½“一次全新排列完毕后,递归退栈回到这里,将刚刚设置的值重置为0, æ¯”如上次设置了i=3,即索引为3的值设为0(即值为123中的3)  ç„¶åŽåˆ¤æ–­å¾ªçŽ¯ä½“i是否小于等于n,如果等于n,则继续退栈回到索引为2的位置,继续把索引为2的值重置为0,紧接着i++,i由2变为3,即a[2]=3,再次递归调用,step由2变成3,不满足n+1,再进入for循环当i=2时满足条件,并将i=2的值赋给a[step]=2 ==a[3]=2 }  ä¾æ­¤ç±»æŽ¨ã€‚。。

它的执行过程就是由末端往前端方向两两交换元素的,其中book是用来是否交换过的标记  å› ä¸ºæ¯ä¸€æ¬¡å…¨æŽ’列完后,都要将它重置为0,所以在递归调用函数上下会有一个book[i]=1和book[i]=0的标记。 
它的值的变化是用for循环的增量i来控制的。如果你学过栈的话,相信这个算法很好理解。*/
 
  
 }追问

谢谢您的解答,不过我还想问一下,把索引为3的值设为0 后,然后判断循环体i是否小于等于n,为什么等于n的时候,要推栈回索引为2的位置啊?

温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网