数列递推算法的原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数列递推算法的原理相关的知识,希望对你有一定的参考价值。

什么是递推
所谓递推,是指从已知的初始条件出发,依据某种递推关系,逐次推出所要求的各中间结果及最后结果。其中初始条件或是问题本身已经给定,或是通过对问题的分析与化简后确定。
从已知条件出发逐步推到问题结果,此种方法叫顺推。
从问题出发逐步推到已知条件,此种方法叫逆推。
无论顺推还是逆推,其关键是要找到递推式。这种处理问题的方法能使复杂运算化为若干步重复的简单运算,充分发挥出计算机擅长于重复处理的特点。
递推法是一种重要的数学方法,在数学的各个领域中都有广泛的运用,也是计算机用于数值计算的一个重要算法。
递推算法的首要问题是得到相邻的数据项间的关系(即递推关系)。递推算法避开了求通项公式的麻烦,把一个复杂的问题的求解,分解成了连续的若干步简单运算。一般说来,可以将递推算法看成是一种特殊的迭代算法。

递推的特点
可用递推算法求解的题目一般有以下两个特点:
1、问题可以划分成多个状态;
2、除初始状态外,其它各个状态都可以用固定的递推关系式来表示。
在我们实际解题中,题目不会直接给出递推关系式,而是需要通过分析各种状态,找出递推关系式。

【例1】数字三角形。
如下所示为一个数字三角形。请编一个程序计算从顶到底的某处的一条路径,使该路径所经过的数字总和最大。只要求输出总和。

1、 一步可沿左斜线向下或右斜线向下走;
2、 三角形行数小于等于100;
3、 三角形中的数字为0,1,…,99;
测试数据通过键盘逐行输入,如上例数据应以如下所示格式输入:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
【算法分析】
  此题解法有多种,从递推的思想出发,设想,当从顶层沿某条路径走到第i层向第i+1层前进时,我们的选择一定是沿其下两条可行路径中最大数字的方向前进,为此,我们可以采用倒推的手法,设a[i][j]存放从i,j 出发到达n层的最大值,则a[i][j]=maxa[i][j]+a[i+1][j],a[i][j]+a[i+1][j+1],a[1][1] 即为所求的数字总和的最大值。

//【参考程序】
#include<iostream>
using namespace std;
int main()
int n,i,j,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;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
思考
如果要输出最大和的路径该怎么处理呢?

【例2】 骨牌问题
有2 × n的一个长方形方格,用一个1 × 2的骨牌铺满方格。
编写一个程序,试对给出的任意一个n(n>0), 输出铺法总数。
【算法分析】
 (1)面对上述问题,如果思考方法不恰当,要想获得问题的解答是相当困难的。可以用递推方法归纳出问题解的一般规律。
 (2)当n=1时,只能是一种铺法,铺法总数有示为x1=1。
 (3)当n=2时:骨牌可以两个并列竖排,也可以并列横排,再无其他方法,如下左图所示,因此,铺法总数表示为x2=2;

 (4)当n=3时:骨牌可以全部竖排,也可以认为在方格中已经有一个竖排骨牌,则需要在方格中排列两个横排骨牌(无重复方法),若已经在方格中排列两个横排骨牌,则必须在方格中排列一个竖排骨牌。如上右图,再无其他排列方法,因此铺法总数表示为x3=3。
  由此可以看出,当n=3时的排列骨牌的方法数是n=1和n=2排列方法数的和
参考技术A 数学归纳法

八大算法思想

八大算法:枚举、递推、递归、分治、贪心、试探法、动态迭代和模拟算法思想。

一、枚举算法思想(暴力算法)

  将问题的所有可能答案一一列举,根据判断条件判断此答案是否合适,一般用循环实现。

  经典运用:百钱买百鸡、填写运算符

 

二、递推算法思想

  1.顺推法:从已知条件出发,逐步推算出要解决问题的方法。

  2.逆推法:从已知结果出发,用迭代表达式逐步推算出问题开始的条件,即顺推法的逆过程。

  经典运用:斐波那契数列(顺推法)、银行存款(逆推法)

 

三、递归算法思想

  1.递归过程一般通过函数或子过程实现;

  2.递归算法在函数或子过程的内部,直接或间接调用自己的算法

  3.递归算法实际上是把问题转化为规模缩小了的同类问题的子问题,然后再递归调用函数或过程来表示问题的解

  注意:必须有一个明确的递归结束条件;如果递归次数过多,容易造成栈溢出。

  经典运用:汉诺塔问题、阶乘问题

 

四、分治算法思想

  将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。只要求出子问题的解,就可得到原问题的解。

  一般步骤:

    1.分解,将要解决的问题划分成若干个规模较小的同类问题

    2.求解,当子问题划分得足够小时,用较简单的方法解决

    3.合并,按原问题的要求,将子问题的解逐层合并构成原问题的解

  经典运用:大数相乘问题、比赛日程安排

 

五、贪心算法思想

  从问题的某一个初始解出发,逐步逼近给定的目标,以便尽快求出更好的解。

  局限:

    不能保证最后的解是最优的;

    不能求最大最小解问题;

    只能求满足某些约束条件的可行解范围。

  基本过程:

    1.从问题的某一初始解出发

    2.while能向给定总目标前进一步

    3.求出可行解的一个解元素

    4.由所有解元素组合成问题的一个可行解

  经典运用:装箱问题、找零方案

 

六、试探算法(回溯法)

  在试探算法中,放弃当前候选解,并继续寻找下一个候选解的过程称为回溯。扩大当前候选解的规模,以继续试探的过程称为向前试探。

  (为求得问题的正确解,会先委婉地试探某一种可能情况。在进行试探过程中,一旦发现原来选择的假设情况是不正确的,马上会自觉地退回一步重新选择,然后继续向前试探。反复进行,直到得到解或证明无解时才死心)

  基本步骤:

    1.针对所给问题,定义问题的解空间

    2.确定易于搜索的解空间结构

    3.以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索

  经典运用:八皇后问题、29选7彩票组合

 

七、迭代算法(辗转法)

  是一种不断用变量的旧值递推新值的过程,解决问题时总是重复利用一种方法。

  1.确定迭代变量:直接或间接地不断由旧值递推出新值的变量

  2.建立迭代关系式:新值与旧值的公式或关系。(解决迭代问题的关系)

  3.对迭代过程进行控制:确定迭代过程什么时候结束

    所需的迭代次数是个确定值,可以计算出来:可以构建一个固定次数的循环来实现对迭代过程的控制;

    所需的迭代次数无法确定:需要进一步分析出用来结束迭代过程的条件。

  经典运用:求平方根问题

 

八、模拟算法思想

  对真实事物或者过程的虚拟。

  经典运用:猜数字游戏、掷骰子问题

 

http://www.cnblogs.com/zuzZ/p/8178950.html

以上是关于数列递推算法的原理的主要内容,如果未能解决你的问题,请参考以下文章

递推的递推算法

递推算法

递推算法与二分算法

递推算法

ybtoj「基础算法」第1章 递推算法强化训练贪心A. 1.划分数列

Pascal算法之回溯及递推详细介绍、