关于递归函数的部分说明

递归是指一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的。用递归过程定义的函数,称为递归函数,例如连加、连乘及阶乘等。凡是递归的函数,都是可计算的,即能行的
最容易混淆的就是全局变量与局部变量的区别

#include <stdio.h>
void f()
{
	char x;
	scanf("%c",&x);
	if(x=='*'){
		printf("%c",x);
	}
	else{
		f();
		printf("%c",x);
	}
	return;
}
int main()
{
	f();
	return 0;
}

输入样例
abc*

输出样例
*cba

#include <stdio.h>
char x;
void f()
{
	scanf("%c",&x);
	if(x=='*'){
		printf("%c",x);
	}
	else{
		f();
		printf("%c",x);
	}
	return;
}
int main()
{
	f();
	return 0;
}

输入样例
abc*

输出样例


由上面两个程序可以看出,它们定义的变量是不一样的,第一个函数的变量x是局部变量,而第二个程序的变量x是全局变量,这就导致了它们的输出结果不一样。
分析程序1
在这里插入图片描述
上面是进入函数f( )后的运行过程,刚开始输入x=a,if为假,再次调用f( )函数,再次输入x=b,以此类推下去,到最后if为真时,输出x= *,再返回输出x=c,以此类推下去,最后的到的结果是 *cba。

而由于变量x是局部变量,存放在内存的栈区,属于动态存储类别, 占动态存储区空间,函数调用结束后自动释放。
如:看上面的流程图1,当第⑤执行后,则第四个框内的数据都会被系统回收,x的值就看第三个框,变为c,以此下去,直到结束。所以最后的结果并不会跟程序2的结果一样输出****。

分析程序2
在这里插入图片描述
程序2中的自定义函数f( )与程序1的执行过程差不多,只是变量x变成了全局变量。全局变量存放在内存中的静态区,在该区的数据只有在程序全部执行完之后才会被释放。

看上面的流程图2,x是全局变量,所以x放在了静态区里面,每次激活函数f( )后,输入的x的值会覆盖前一个x的值,当程序执行到第⑤步执行后,x的值并不会像程序1那样被系统回收,它会保留下来,当函数进入第三个框内的时候,输出的x依然是*,以此推下去。因此,程序会输出****。
递归函数搭配记忆化搜索也可以很好的提高效率

typedef long long int ll;
const int maxn=1e6;
ll a[maxn];
ll fib(int n){
	if(n==1||n==2) return a[n];
	else {
		if(a[n-1]==0) a[n-1]=fib(n-1);
		if(a[n-2]==0) a[n-2]=fib(n-2);
		return a[n-1]+a[n-2];
	}
}

以上部分仅以自省

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值