算法笔记之迭代算法(正推和倒推)

迭代法

概念:迭代法(iteration)也叫“辗转法”,是一种不断用变量旧值推出新值的解决问题的方法。

步骤

1.确定迭代模型
根据问题描述,分析出前一个值与下一个值的迭代关系数学模型。
2.建立迭代关系式
递推数学模型一般是带下标的字母,在算法设计中要将其转换为“循环不变式”(迭代关系式)
3.对迭代过程进行控制
确定在什么时候结束迭代过程。

迭代模型是通过小规模问题逐步解决大规模问题的解。

1.递推法(正推)

问题:兔子繁殖问题(斐波拉契数列)
一对兔子从出生后第三个月开始,每月生一对兔子。小兔子到第三个月又开始生下一代兔子。假如兔子只生不死,一月份抱来一对刚出生的小兔子,问一年中每个月各有多少对兔子?
解决:
首先把情况列举出来,发现其中的规律,找到一个不变式(即循环不变式)
表格中是兔子的对数(不是只数)

123456
111+1=22+1=33+2=55+3=8

说明:第一个月和第二个月都是一对兔子,因为兔子还没成熟(三个月成熟)。
第三个月生了一对小兔子,现在兔子总对数是两对。(1+1=2)
第四个月第一对兔子又生了一对(成熟兔子每个月都生一对),现在兔子总对数是3对。(2+1=3)
第五个月,两对成熟兔子生了两对,现在兔子总对数是5对。(3+2=5)
第六个月,三对成熟兔子生了三对,现在兔子总数是8对。(5+3=8)

以此类推,我们发现兔子数量符合以下规律:

//用三个变量实现数量的累加
c=a+b;
b=a;
a=c;

完整代码如下:

#include<iostream>
using namespace std;
int main(){
	int i;
	int a=1,b=1,c;//a,b代表第一个二月的兔子数量
	//计算十二个月的兔子数量 
	for(i=0;i<12;i++){
		c=a+b;
		cout<<"第"<<i+1<<"个月兔子数量:"<<c<<endl;
		b=a;
		a=c;
	}
	return 0;
}

运行结果:
在这里插入图片描述

2.倒推法

概念:
从后向前推解问题,即由结果倒过来推解前提条件。
问题:猴子吃桃问题
一只小猴子摘了若干桃子,每天吃现有桃子的若干个多一个,到第10天时就只有一个桃子了,求原有多少个桃?
解决:

1098
1(1+1)*2{[(1+1)*2]+1}*2

递推公式为(此处ii-1为下标):
ai=(1+ai-1)*2 i=9,8,7,6,…,1
完整代码如下:

#include<iostream>
using namespace std;
int main(){
	int i,a;
	a=1;
	for(i=9;i>=1;i--){
		a=(a+1)*2;
	}
	cout<<"原有桃子数为:"<<a<<endl;
	return 0;
} 

运行结果:
在这里插入图片描述


最后

原创不易,如果对您有帮助,请点个赞再走呀(づ ̄3 ̄)づ╭❤ ~拜托啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nan_black

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值