weinan030416

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

递归函数的分析

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

#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处

posted on   楠030416  阅读(63)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示