递归函数与for循环

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

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开始执行,,当这层执行完之后,就可以跳出整个循环

猜你喜欢

转载自blog.csdn.net/chengchaonan/article/details/79749879