递归函数的分析
自己写了一个奇奇怪怪的递归函数
#include<iostream>
using namespace std;
int i=0,j=0;
void dfs(int u);
void tfs(int u)
{
if(u>3)
{
return;
}
j++;
cout<<"j="<<j<<" "<<"u="<<u<<endl;//1
dfs(u+1);//2
cout<<u<<" "<<"x"<<endl;//3
tfs(u+2);//4
}
void dfs(int u)
{
if(u>3)
{
return;
}
i++;
cout<<"i="<<i<<" "<<"u="<<u<<endl;//5
dfs(u+1);//6
cout<<u<<" "<<"s"<<endl;//7
tfs(u+2);//8
}
int main()
{
dfs(0);
return 0;
}
运行结果:
运行过程分析:
开头dfs(0),先执行5,输出i=0 u=0,然后执行6,再执行调用的新的函数5,直到调用到第四个函数时候满足u>3退出
然后调用的前三个新的函数执行下一步7,越晚调用的函数越早执行下一步
执行8,同样越晚调用的函数越早执行下一步,只有u=1的时候,tfs(3)满足!>3不会被return,执行1
执行2,u=4>3,return,下一步上一步中的函数执行3,并在下一步递归4中返回
这时候最开始的dfs(0)函数执行7,8,1,2,5,6,7,3
递归函数步骤复杂,不容易描述出来具体步骤,大脑在压栈的时候很难受,不过我们在做题的时候只需要设计好函数,并相信它可以完成任务就可以了。
其它发现,对于下面这个程序,cout<<n<<endl;放在a处和b处运行结果不同。
#include <iostream>
using namespace std;
void dfs(int n)
{
if(n==0)
return;
//cout<<n<<endl;//a
dfs(n-1);
//cout<<n<<endl;//b
}
int main()
{
dfs(10);
}
在a处执行完cout,再dfs压栈。
在b处先dfs压栈,再执行cout。
在a处
在b处