算法基础二 递推法

/*递推法*/
/*斐波那契数列 1 1 2 3 5 8 13..... f(n)?*/
/*递推法的特点是由前向后推算,因此注意起始条件,并在推算过程中保存结果供下一步推算使用~*/
#include<iostream>
using namespace std;
int f1(int n)
{
    if (n < 3)return 1;
    else
    {
        int t1 = 1; int t2 = 1;
        for (int i = 2; i < n; i++)
        {
            int temp = t1 + t2;
            t2 = t1;
            t1 = temp;
        }
        return t1;
    }
}

//提供递归算法对比,相较而言递归法更简单,我们下次详细讨论~
int febonacci(int n)
{
    if (n < 3)return 1;
    else return febonacci(n - 2) + febonacci(n - 1);
}
int main()
{
    int n;
    cout << "请输入f(n)序列n" << endl;
    cin >> n;
    cout << "递推法:f(" << n << ")=" << f1(n)<<endl;
    cout << "递归法:f(" << n << ")=" << febonacci(n) << endl;
}
时间: 2024-08-28 00:24:11

算法基础二 递推法的相关文章

算法设计 之 递推法

递推法就是根据已知条件,分析推导出问题中的联系,然后一步一步进行推倒直至得到结果. 根据具体问题我们需要选择是正推还是逆推来解决问题. 下面先举一个递推中的经典例子,就是求兔子数量的问题: 现有一只一个月大的兔子,已知当兔子在第三个月大时每月就可以生下一只小兔子(好吧,就按兔子是无性繁殖的),求一年后兔子的总数量. 我们根据问题分析,发现可以把兔子分三类:一个月大.二个月大.三个或三个以上月大,列表分析: 月份 1月大 2月大 >=3月大 1 1 0 0 2 0 1 0 3 1 0 1 4 1

递推(二):递推法的应用

下面通过一些典型实例及其扩展来讨论递推法的应用. [例2]骨牌铺方格 在2×n的一个长方形方格中,用一种2×1的骨牌铺满方格.输入n(n<=40),输出铺放方案的总数. 例如n=3时,为2×3方格,骨牌的铺放方案有三种,如下图1所示. 图1  2×3方格的骨牌铺放方案 (1)编程思路. 设f[i]为铺满2*n方格的方案数,则有    f[i]=f[i-1]+f[i-2]. 其中,f[i-1]为铺满2*(n-1)方格的方案数(既然前面的2*(n-1)的方格已经铺满,那么最后一个只能是竖着放).f[

递推(一):递推法的基本思想

所谓递推,是指从已知的初始条件出发,依据某种递推关系,逐次推出所要求的各中间结果及最后结果.其中初始条件或是问题本身已经给定,或是通过对问题的分析与化简后确定. 利用递推算法求问题规模为n的解的基本思想是:当n=1时,解或为已知,或能非常方便地求得:通过采用递推法构造算法的递推性质,能从已求得的规模为1.2.….i−1的一系列解,构造出问题规模为i的解.这样,程序可从i=0或i=1出发,重复地由已知至i−1规模的解,通过递推,获得规模为i的解,直至获得规模为n的解. 可用递推算法求解的问题一般有

001-算法-递推法

一.概念: 递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法.递推分为顺推和逆推两种. 递推算法使用“步步为营”的方法,不断利用已有的信息推导出新的东西. 顺推法:是指从已知条件出发,逐步推算出要解决问题的方法.例如:斐波拉契数列就可以通过顺推法不断递推算出新的数据. 逆推法:是从已知的结果出发,用迭代表达式逐步推算出问题开始的条件,即顺推法的逆过程. demo : http://blog.csdn.net/jtlyuan/article/details/7

实用算法的分析与程序设计——递推法(顺推法)包含实例,代码

顺推法即由边界条件出发,通过递推关系式推出后项值,再由后项值按递推关系式推出再后项值...依次递推,直至从问题初始陈述向前推进到这个问题的解为止. 实例 代码 #include<iostream> #include<stdlib.h> using namespace std; const int maxN = 60 ; int N = 4 ,d = 2 , m = 3; float a1 = 2 ,an = 5; void input() { cout<<"i

实用算法的分析与程序设计——递推法(贮油点 含算法分析、代码)

倒推法 所谓倒推法就是在不知初始值的情况下,经某种递推关系而获知问题的解或目标,再倒过来,推知它的初始条件,因为这类问题的运算过程是一一映射的,故可分析得其递推公式.然后再从这个解或目标出发,采用倒推手段,一步步地倒推到这个问题的初始陈述. 贮油点 一辆重型卡车欲穿越1000公里的沙漠,卡车耗油为1升/公里,卡车总载油能力为500公升,显然卡车装一次油是过不了沙漠的.因此四级必须设法在沿途建立几个储油点,使卡车能顺利穿越沙漠,试问司机如何建立这些贮油点?每一贮油点应存多少汽油,才能使卡车以消耗最

实用算法的分析与程序设计——递推法(倒推法)

倒推法就是在不知初始值的情况下,经某种递推关系而获知问题的解或目标,再倒过来,推知它的初始条件.因为这类问题的运算过程是一一映射的,故可分析得其递推公式,然后再从这个解或目标出发,采用倒推手段,一步步地倒推到这个问题的初始陈述. 贮油点 一辆重型卡车欲穿过1000公里的沙漠,卡车耗油为1升/公里,卡车总载油能力为500公升,显然卡车装一次油是过不了沙漠的,因此四级必须设法在沿途建立几个贮油点,使卡车能顺利穿越沙漠,试问司机如何建立这些贮油点?每一贮油点应存多少汽油,才能使卡车以消耗最少汽油的代价

约瑟夫环-公式递推法

约瑟夫问题 约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报.如此反复,最后剩下一个,求最后的胜利者. 例如只有三个人,把他们叫做A.B.C,他们围成一圈,从A开始报数,假设报2的人被杀掉. 首先A开始报数,他报1.侥幸逃过一劫. 然后轮到B报数,他报2.非常惨,他被杀了 C接着从1开始报数 接着轮到A报数,他报2.也被杀死了. 最终胜利者是C 解决方案 普通解法 刚学数据结构的时候,我们可能用链表的方法去模拟这个过程,N个人看作是N个链表节

算法基础一 穷举法

/*穷举法*/ /*鸡兔同笼35头,94足,鸡兔各几只?*/ #include<stdio.h> const int Num = 35; const int Foots = 94; int main() { int cN;//鸡 int rN;//兔 for (cN = 0; cN <= 35; cN++) { rN = Num - cN; if (Foots == cN * 2 + rN * 4 ) { printf("鸡:%d,兔:%d\n",cN,rN); }