算法系统学习-兔子生兔子(迭代算法-正推法)

简介: 该系列是基于有一定语言基础(C,C++,Java等等)和基本的数据结构基础进行的算法学习专栏,如果觉得有点吃力 😥 ,建议先了解前提知识再学习喔!本个专栏会将用更容易理解的表达去学习算法,如果在一些表述上存在问题还请各位多多指点

迭代(Iteration)算法


概述:

也称是一种不断用变量的旧值递推出新值的解决问题的方法。一般用于数值计算,常见的累加,累乘都是迭代算法策略的基础应用。


主要步骤:

  1. 确定迭代模型
  2. 建立迭代关系式(主要工作):递推数学模型一般是带下标字母,算法设计中要将其转化为:“循环不变式”--迭代关系式。而所谓的迭代关系式就是一个直接或间接地不断旧值递推新值的表达式
  3. 对迭代过程进行控制:一般分为两种情况,一种是已知或可以计算出来所需的迭代次数,这时可以构建一个固定次数的循环来实现对迭代过程的控制。另外是所需的迭代次数无法确定,需要分析出迭代过程的结束条件,甚至于要考虑有可能得不到目标解的情况,避免出现迭代过程的死循环。


递推法


基础概念:

递推法算法是最基本的表现形式,从小规模的问题推解出大规模问题的一种方法,也称其“正推”。如累加过程就是求出前n-1项和的基础上推出前n项和的,递推公式是Sn=Sn-1 +An。由于无须保存每次的累加结果。所以用一个迭代变量s存储每次的累加结果,累加对象存储在变量a中,这样的递推公式就抽象成 “循环不变” 的累加式: S=s+a


Case1:

一对兔子从出生后第三个月开始,每月生一对小兔子,小兔子到第三月又开始生下一代小兔子,假若兔子只生不死,一月份抱来一对刚出生的小兔子,问一年中每个月各有多少对兔子?


问题分析:

用枚举法:将问题的求解过程以及各种不同情况一一列举出来,从中发现解决问题的方法。

因为一对兔子是要第三个月才可以生,那么第三个月存在两对,而另外一对要第三个月才能出生,因此列出兔子第三个月的对数就是两个月兔子对数的和。过程如下:

月份 1月 2月 3月 4月 5月 6月 .........
对数 1 1 1+1=2 2+1=3 3+2=5 5+3=8 ........

数学建模:

y1=y2=1,yn=yn-1+yn-2,n=3,4,5........ 其实可以发现是斐波那契数列

算法设计:

a,表示成每月的前2个月的对数,b表示前1一个月的兔子的对数,它们的初值均为1,这样3月份兔子对数为 c =a+;

求4月份兔子的对数时,先将4月份前2个月和前1月兔子的对数存储在变量a,b中,即a=b,b=c,再将4月份兔子的对数继续保存在变量c中,即c=a+b+.......当然这要操作,在变量中的数据被覆盖之前应先行输出已求解的结果。

算法1如下:

main(){
    int i,a=1,b=1;
    coout<<a<<b;
    for(i=1;1<=10;i=i+1){
        c=a+b;
        cout<<c;
        a==b;
        b==c;
    }
}
复制代码


构造“不变式”不止一种,当然也可以做如下表:

月份 1 2 3 4 5 6 7
对数 a b c=a+b a=b+c b=a+c c=a+b ....

由上表可知:只是做了“c=a+b a=b+c b=a+c”,循环该不变式,这样一次循环其实是递推了3步,循环次数自然而然就要减少了


算法2如下:

main(){
int i,a=1,b=1;
    cout<<a<<b;
    for(i=1;1<=4;i++){  
        c=a+b;
        a=b+c;
        b=a+c;
        cout<<a<<b;
    }
}
复制代码


可是算法2最后输出的并不是12项,而是2+3*4=12项,这样的算法不算太好。因此,我们发现前面算法1,2基本思路都是基于这样一个事实:前三个月的数据输出后就无法保存了,从而构造了循环的“不变式”。其实一个赋值语句的执行过程是众所周知的---赋值过程是先计算后赋值,这样以上递推过程就无须引入第三个变量。 因此如下表递推迭代表达式:

月份 1 2 3 4 5 6
对数 a b a=a+b b=a+b a=a+b b=a+b

由此可以知道循环不变式为“a=a+b b=a+b”


算法3如下:

main(){
int i,a=1,b=1;
    cout<<a<<b;
    for(i=1;1<=5;i++){  
        a=a+b;
        b=a+b;
        cout<<a<<b;
    }
}
复制代码


总结:

后两种解法是在通过有限的变量,存储信息的基础上,在递推过程中发现“重复的周期”,实际上用的比较少。如果从周期角度讨论,case的算法和其他循环算法的周期都是“1”。

目录
相关文章
|
27天前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
14天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
49 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
14天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
56 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
20天前
|
机器学习/深度学习 算法 5G
基于MIMO系统的SDR-AltMin混合预编码算法matlab性能仿真
基于MIMO系统的SDR-AltMin混合预编码算法通过结合半定松弛和交替最小化技术,优化大规模MIMO系统的预编码矩阵,提高信号质量。Matlab 2022a仿真结果显示,该算法能有效提升系统性能并降低计算复杂度。核心程序包括预编码和接收矩阵的设计,以及不同信噪比下的性能评估。
38 3
|
23天前
|
机器学习/深度学习 人工智能 自然语言处理
【EMNLP2024】基于多轮课程学习的大语言模型蒸馏算法 TAPIR
阿里云人工智能平台 PAI 与复旦大学王鹏教授团队合作,在自然语言处理顶级会议 EMNLP 2024 上发表论文《Distilling Instruction-following Abilities of Large Language Models with Task-aware Curriculum Planning》。
|
27天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
27天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
27天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
27天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
下一篇
无影云桌面