全排列问题用递归函数解决

void dfs(int step)
{
int i;
if(step==n+1)
for(i=1;i<=n;i++)
{
printf("%d",a[i]);
}
}
//这种情况跳出循环
for(i=1;i<=n;i++)
{
if(book[i]==0)
{
a[step]=i;
book[i]=1;
dfs(step+1);
book[i]=0;
}
}
return 0;
}

一.(执行到开始往回返回函数)

(此时在for循环的第三层)

传入step的值为1


1.执行for循环的i=1,a[1]=1;book[1]=1;


(注意剩下的1.book[1]=0没有执行 2.在执行完1之后,整个for循环还没有结束,此时i=1;要从i==2开始执行完这个for循环才可以


2.执行dfs(2),此时book【1】=1,a[2]=2;book[2]=1


(此时剩下的1.book[2]=0没有执行,在执行完1之后,整个for循环还没有结束,先执行book2=0,然后


for循环从i=3开始执行,直到整个for循环结束,才算整个dfs(2)结束


才能返回1.执行1剩下的程序。


3.dfs(3),此时a[3]=3,book 3=1;


此时剩下的book 3=0 还没有执行,但是只要执行完book3)=0,因为此时for循环到这里就结束了,所以执行完这一步


相当于dfs(3)执行完毕,可以返回2.执行2之后的程序


4.执行dfs(4)因为不满足条件,所以直接返回dfs3执行book 3=0执行完这一步之后就返回dfs2.


二。(开始返回第二层函数)

(此时在for循环的第二层)

从返回dfs 2,执行完book2==0,此时book 3也等于0.但是for循环是从i=3开始的,此时step==2,所以是a2=3,因为3先被拿出来判断


这里有个book3=0要返回执行,在这个book3执行完毕之后,for循环也到达上限,dfs2执行完毕,要返回dfs1


接着执行dfs3,这里的执行跟返回执行的过程不一样,因为这里是从for循环的i=1开始执行,但是返回执行是从for循环没有执行完的部分开始执行




执行dfs3的过程:此时只有book2==0,所以step3==2,再到dfs4返回了,然后执行book2==0.现在是dfs3全部执行完了,返回的是dfs2


执行完book3=0,等于dfs2也执行完毕,此时要返回dfs1




三。(要执行完三层for循环才结束,此时才进行到第一层for循环)

(这里已经返回第一层函数,但是此时只是在for循环的第一层)

=0,而此时第一步要做的就是book1==0,然后继续for循环从i=2开始此时a1=2,book2=1,


待会有个book2=0要返回执行。



执行dfs2,此时book1和book3等于0,不同于返回执行是从for循环的剩下一半执行,



这里从i=1开始,a2=1接着a3=3,因为此时book2还没有收回,只剩下book1和book3


只有dfs2执行完毕,才会收回这个book2


这一层是执行完第二层for循环,


当完成这一层for循环之后


book1,2,3都为0,进入第三层循环,从i=3开始执行,,当这层执行完之后,就可以跳出整个循环