博客
关于我
递推算法——例题详解
阅读量:788 次
发布时间:2019-03-24

本文共 1445 字,大约阅读时间需要 4 分钟。

递推算法的本质

递推算法的本质是通过将复杂问题分解为多个较小的问题并建立彼此之间的数字关系,将问题一步步简化求解。在递推过程中,我们通过已知部分问题的结果,逐步推导出未知部分的问题解,类似于从下而上解决问题的方式,使得问题变得更加清晰和可控。

例一:数塔问题(倒推法)

数塔问题是递推算法的经典例子。问题描述为:在一个由数字构成的数塔中,从顶部到底部找出一条路径,使得路径上的数字之和最大。解决这个问题的常用方法是倒推法,即从上层向下层推导。

分析:将问题从上而下分解显然并不直观,因此我们选择从下而上进行分析。通过观察我们可以发现,每一层的数字之和等于下一层中与其相邻的两个数字中较大的那个加上当前层的数字。

最终,从最底层到最顶层,我们逐步计算每层的值,从而得到最大和路径。

代码实现:

#include 
#include
#include
#include
using namespace std;int main() { int n, i, j; char a[101][101]; cin >> n; for (i = 1; i <= n; ++i) { for (j = 1; j <= i; ++j) { cin >> a[i][j]; } } for (i = n - 1; i >= 1; --i) { for (j = 1; j <= i; ++j) { if (a[i + 1][j] >= a[i + 1][j + 1]) { a[i][j] += a[i + 1][j]; } else { a[i][j] += a[i + 1][j + 1]; } } } cout << a[1][1] << endl; return 0;}

例二:斐波那契数列的非递归实现

斐波那契数列是一个经典的递推序列,其定义为:f(0)=1,f(1)=1,f(n)=f(n-1)+f(n-2)。通过递推式,我们可以逐步计算出后续的数列项。

分析:观察数列的结构,我们可以发现每一项都等于前两项之和。通过非递归的方式,我们可以通过循环实现,将前一项和前前一项的值相加,逐步生成数列。

代码实现:

#include 
#include
#include
#include
using namespace std;int main() { int f0 = 1, f1 = 1, f2 = 2; int n; cin >> n; for (int i = 3; i <= n; ++i) { f2 = f0 + f1; f0 = f1; f1 = f2; } cout << f2; return 0;}

其他相关类型的问题

类似的递推类型问题还包括经典的蓝桥杯题目“奶牛问题”等,其中涉及递归和非递归的不同实现方法。

转载地址:http://phrkk.baihongyu.com/

你可能感兴趣的文章
mysql 自增id和UUID做主键性能分析,及最优方案
查看>>
Mysql 自定义函数
查看>>
mysql 行转列 列转行
查看>>
Mysql 表分区
查看>>
mysql 表的操作
查看>>
mysql 视图,视图更新删除
查看>>
MySQL 触发器
查看>>
mysql 让所有IP访问数据库
查看>>
mysql 记录的增删改查
查看>>
MySQL 设置数据库的隔离级别
查看>>
MySQL 证明为什么用limit时,offset很大会影响性能
查看>>
Mysql 语句操作索引SQL语句
查看>>
MySQL 误操作后数据恢复(update,delete忘加where条件)
查看>>
MySQL 调优/优化的 101 个建议!
查看>>
mysql 转义字符用法_MySql 转义字符的使用说明
查看>>
mysql 输入密码秒退
查看>>
mysql 递归查找父节点_MySQL递归查询树状表的子节点、父节点具体实现
查看>>
mysql 通过查看mysql 配置参数、状态来优化你的mysql
查看>>
mysql 里对root及普通用户赋权及更改密码的一些命令
查看>>
Mysql 重置自增列的开始序号
查看>>