普通递归与尾递归

递归定义:

递归就是函数直接或间接调用自身。递归函数设计时明确三点,一是明确递归边界条件、二是继续执行递归,三是递归返回。当不满足递归边界条件时,递归前进,也即继续执行递归。当满足边界条件时,递归返回。

递归常用于解决一下三个问题:

1、数据格式就是递归形式,如Fibonacci函数等
2、数据结构以递归定义,如二叉树,图等
3、问题解法是以递归实现,如回溯

普通递归缺点:

普通递归在每次递归调用返回之前,都不会得到计算结果,普通递归解法相比与循环等,运行效率更低。并且每一次调用时,程序都会为这一次调用开辟栈空间存储一些数据,当递归过大,容易栈溢出。
下面为实现Fibonacci函数的普通递归。

int Fibonacci(int n){
	if(n<=2) return 1;
	return Fibonacci(n-1)+Fibonacci(n-1);
}

程序结构十分简单,若求n=5的值,
Fibonacci(5) = Fibonacci(4)+Fibonacci(3) =5
Fibonacci(4) = Fibonacci(3)+Fibonacci(2) = 3
Fibonacci(3) = Fibonacci(2)+Fibonacci(1) = 2
Fibonacci(2) = 1
Fibonacci(1) = 1
程序的递归是从上往下递归,而计算结果并返回是从下往上返回。

尾递归:

尾递归是指一个函数里的最后一个动作是返回一个函数的调用结果的情形,即最后一步新调用的返回值直接被当前函数的返回结果。如:

int f(int x){
	f1();
	f2();
	return g(x);//直接调用函数g(x)
}

其核心理解在于,当调用其他函数时,自身是否能被释放。
尾递归实现Fibonacci:

int Fibonacci(int n ,int ret1,int ret2){
	if(n<=2){
		return 1;
	}
	return Fibonacci(n-1,ret2,ret1+ret2)
}

其实现是本次计算结果,传递到下一次函数中执行计算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值