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

2025-03-24 05:33:22
推荐回答(1个)
回答1:

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来控制的。如果你学过栈的话,相信这个算法很好理解。*/
 
  
 }