递归函数的分析

自己写了一个奇奇怪怪的递归函数

#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处
递归函数的分析

原文链接: https://www.cnblogs.com/weinan030416/p/16687104.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    递归函数的分析

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/5649

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月4日 下午7:46
下一篇 2023年2月4日 下午7:46

相关推荐