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