算法——递推与递归

递推与递归是两个互逆的算法

我们先了解一下什么递推
递推算法是一种简单的算法,通过已知条件,利用特定关系得出中间推论,逐步递推,直到得到结果为止

算法思路

递推可分为顺推法和逆推法两种

顺推法:顺推法是指从已知条件出发,逐步推算出要解决问题的方法
逆推法:逆推法就是从已知的结果出发,用迭代表达式推算出问题开始的条件,即顺推法的逆过程

例(顺推实例): 斐波那契数列
题目描述:13世纪初,欧洲数学家斐波那契在他的著作《算盘书》中出了一个有趣的题目:如果一对兔子每月能生出一对兔子,而每对兔子在它出生后的第三个月里,又能开始生一对兔子,假定在不发生意外的情况下,由一对初生的兔子开始,12个月后能繁殖出多少对兔子?(1<=n<=30)
解题思路:
(1) 首先将兔子分为三种:大兔(已能生小兔),1个月大的小兔(当月生的小兔),两个月大的小兔(上月生的小兔,还没有繁殖能力的小兔),到第三月时2月大的小兔变成大兔
(2)初始状态时,只有一对初生的小兔(1个月大的小兔),所以总数是1对
(3)第1个月时,1个月大的小兔成长为2个月大的小兔,还抹得繁殖能力,所以总数1对
(4)第2个月时,2个月大的小兔成长为大兔,就可以繁♀殖♂一对一个月大的小兔,所以数量是二队
(5)第3个月时,仍然只有一对大兔,将繁♀殖♂出一对一个月大的小兔,同时上个月的1对1个月大的小兔成长为2个月大的小兔,所有数量有3对
(6)以此类推,见下表

从表中数据可以看出,斐波那契数列可以通过递推算法得到
具体算法如下
(1) 设初始值为F0=1,第一个月兔子总数F1=1
(2)第2个月兔子总数F2=F0+F1;
(3)第3个月兔子总数F3=F1+F2;
(4)第n个月兔子总数Fn=Fn-2+Fn-1;
参考代码:

#include<iostream>
using namespace std;
#define NUM 13;
int main(){
	long fib[NUM]={1,1};
	for(int i=2;i<NUM;i++) fib[i]=fib[i-2]+fib[i-1];
	for(int i=0;i<NUM;i++) cout<<fib[i]<<" ";
	return 0;
}


例(逆推实例): 父亲准备为小明的4年大学生活伙食费一次性存在银行一笔钱,使用整存零取的方式,小明每个月月底取1000元供下个月使用。若银行一年整存零取的年利息为1.71%,请问父亲至少要存多少钱?
==解题思路:==若第48个月小明大学毕业连本带息要去100元,则要求出第47个月时银行存款的具体数额
第47月末=1000/(1+0.0171/12); //0.0171/12时月利息
第46个月末=(第47月末+1000)/(1+0.0171/12);

第1个月末=(第2个月末+1000)/(1+0.0171/12);
参考程序

#include<iostream>
using namespace std;
int main(){
	double corpus[49];
	corpus[48]=(double)1000; //第48个月末
	for(int i=47;i>0;i--) corpus[i]=(corpus[i+1]+1000)/(1+0.171/12);
	for(int i=48;i>0;i--) printf("第%d个月末本息合计:%.2f\n",i,corpus[i]);
	return 0;
}

递归算法:递归算法就是一种直接间接地调用自身的算法
例: 求阶乘
题目描述:给定一个数n(n<=30),求n的阶乘(n!)
阶乘; 2!=1x2,3!=1x2x3,n!=n1xn2x···xni;
参考代码:

#include<iostream>
using namespace std;
int fact(int n){
	if(n<=1) return 1;
	else return n*fact(n-1);
}
int main(){
	int n;
	cin>>n;
	cout<<fact(n)<<endl;
	return 0;
}



算法思路:见下图

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值