对接CSP-J/S认证C++算法蓝桥等考导学/三级:基础算法/之二:(11)递推算法

一、观看PPT教程 

01】递推算法

二、练习题(不清楚回头查看有关PPT)

01】下面是有关递推算法的描述,请改正错误的地方:

基本思想——递推算法是一种通过将问题分解为较小的子问题来解决问题的方法。递推算法的基本思路是,从初始状态开始,通过一系列推导和迭代,逐步得到问题的解。在每一步推导中,利用已知的解或已经得到的中间结果,来计算出下一步的解。递推步骤——1.确定初始状态:递推算法是从已知条件推导出未知结果的过程,因此需要确定问题的初始条件。这个初始条件可以是问题中给出的初始值,也可以是手动求解的一些值。2.明确问题的递推关系:递推算法的核心就是通过已知条件推导出未知结果,因此需要通过观察问题的特点,找到问题的递推关系,也就是递推式。3.迭代计算:根据问题的递推关系和初始条件,可以开始逐步计算得到未知结果。递推计算的过程就是反复应用递推关系,将已知的结果代入递推关系中得到新的结果,然后再将新的结果代入递推关系中得到更新的结果,以此类推,直到问题解决。4.终止条件:确定算法的终止条件,即满足终止条件时算法结束。递推算法分类——1)推法:从已知条件出发,逐步推算出要解决的问题的方法;2)推法:从已知问题的结果出发,逐步推算出问题的开始条件。02】问题:有一块2*n的空地,现要使用n块1*2的地砖铺满这块空地,请问有多少种不同的铺法?解决问题的代码如下,请改正错误的地方:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

#include<iostream>using namespace std;int f[100];int func(int n){  if(n <= 2){    return n;  }  f[1] = 1;  f[2] = 2;  for(int i = 3; i < n; i++){    f[i] = f[i - 1] + f[i -2];  }  return f[n];}int main(){    int n;    cin >> n;    int ways = func(n);    cout << "不同的铺法数为:" << ways << endl;  return 0;}

03】问题:树上有若干个桃子,第一天猴子吃掉树上桃子的一半多1个,第二天吃掉剩余桃子的一半多1个,以此类推,每一天都吃掉剩余桃子的一半多1个,第七天吃完后,树上还剩下1个桃子。问树上原来有多少个桃子?解决问题的代码如下,请改正错误的地方:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

#include<iostream>using namespace std;int f(){  int peaches = 1;  for(int day = 7; day > 1; day--){    peaches = (peaches + 1) * 2;  }  return peaches;}int main(){    int total_peaches = f();    cout << total_peaches << endl;  return 0;}

04】编程题:细胞分裂题目描述有一种特殊细胞,每对成熟细胞经过x分钟后会分裂出y对新细胞(成熟细胞只分裂1次),新细胞经过2分钟变为成熟细胞。假设每对细胞都不会消失,开始只有1对成熟细胞(x分钟后才分裂),请计算z分钟后,成熟的细胞有多少对。输入描述
输入三个整数x、y、z ( 0≤x≤7 1y5, xz20) ,整数之间以一个空格隔开。输出描述一个整数,表示z分钟后,成熟细胞的对数。样例输入2 3 4
样例输出4
注:原例题有点朦胧,这里做了一些修改,原来的分析和代码也有误。
05】递推算法总结,请改正错误的地方:递推算法的优点是简单易懂、计算效率高,适用于具有重复性和可分解性的问题。递推算法适用于那些可以通过迭代求解的问题,如菲波那契数列、汉诺塔移动次数、猴子吃桃、数字三角形(顺推法)、骨牌铺满方格、蜜蜂路线、吃糖果、昆虫繁殖、位数问题、分苹果、踩方格等。在编写递推算法时,需要注意选择合适的迭代方式和开始条件,以确保算法的正确性和效率。