全排列问题用递归函数解决
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开始执行,,当这层执行完之后,就可以跳出整个循环