常见算法思想2:递推法

Posted

tags:

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

参考技术A 递推算法犹如稳重的有经验的老将,使用“稳扎稳打”的策略,不断利用已有的信息推导出新的东西。
在日常应用中有如下两种递推算法:
(1)顺推法:从已知条件出发,逐步推算出要解决问题的方法。
(2)逆推法:从已知的结果出发,用迭代表达式逐步推算出问题开始的条件,即顺推法的逆过程。

例如斐波那契数列就可以通过顺推法不断递推算出新的数据:

分析:我们要想办法找规律
兔子对数:
第一个月:1;第二个月:1;第三个月: 2;第四个月: 3;第五个月: 5;第六个月: 8;...
由此可见兔子的对象数据是:1,1,2,3,5,8...

规则:
A:从第三项开始,每一项是前两项之程
B:而且说明前两项是已知的

假如相邻的两个月的兔子对数是a,b
第一个相邻的数据:a=1,b=1
第二个相邻的数据:a=1,b=2
第三个相邻的数据:a=2,b=3
第四个相邻的数据:a=3,b=5
看到了:下一次的a是以前的b,下一次的b是以前的a+b;

可采用逆推法分析存钱和取钱的过程,因为按照月为周期取钱,所以4年可以分为48个月,并对每个月进行计算。
如果第48个月后sun大学毕业连本带息要取1000元,则要求第47个月银行的存钱金额为:
第47个月月末存款=1000/(1+0.0172/12);
第46个月月末存款=(第47存款+1000)/(1+0.0172/12);
第45月末存款=(第46存款+1000)/(1+0.0172/12);
…….
第2月月末存款=(第3月月末存款+1000)/(1+0.0172/12);
第1月月末存款=(第2月末存款+1000)/(1+0.0172/12);

打印结果:

八大算法思想

八大算法

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

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

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

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

 

二、递推算法思想

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

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

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

 

三、递归算法思想

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

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

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

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

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

 

四、分治算法思想

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

  一般步骤:

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

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

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

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

 

五、贪心算法思想

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

  局限:

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

    不能求最大最小解问题;

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

  基本过程:

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

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

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

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

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

 

六、试探算法(回溯法)

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

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

  基本步骤:

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

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

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

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

 

七、迭代算法(辗转法)

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

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

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

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

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

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

  经典运用:求平方根问题

 

八、模拟算法思想

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

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

 

---end---

以上是关于常见算法思想2:递推法的主要内容,如果未能解决你的问题,请参考以下文章

递推:递推法的基本思想

八大算法思想

八大算法思想

算法之——————递推的简单解释

C语言用递推和递归两种算法完成斐波那契数列的计算,给一下代码

数列递推算法的原理