• 第一篇 递推思想


    <1> 顺推的例子

          上过大学的应该都知道著名的“斐波那契”数列吧,说的是繁殖兔子的问题,题目我就大概说一下。

    如果1对兔子每月能生1对小兔子,而每对小兔在它出生后的第3个月就可以生1对小兔子,如果从1对初生的小兔子开始,1年后能

    繁殖多少兔子?

    思路:其实这个问题我们可以将兔子划分为“1月大的兔子“,”2月大的兔子“,”3月大的兔子“。

            ① 初始时:            一对1月大小兔子,总数为1对。

            ② 第一个月:         1月大的小兔子变成2月大的兔子,总数还是1对。

            ③ 第二个月:         2月大的小兔子变成3月大的兔子,繁殖了一对小兔子,总数为2对。

            ④ 第三个月:         3月大的兔子tmd有生了一对小兔子,上个月1月大的小兔子变成了2月大的兔子,总数为3对。

             ......                    ......

      1月份 2月份 3月份 4月份 5月份。。。6月份
    1个月的兔子 1   1 1 2                    3
    2个月的兔子   1   1 1                    2
    >=3个月的兔子     1 1 2                    3

            F0=1

            F1=1

            F2=F0+F1

            F3=F1+F2

            ......

            Fn=Fn-2+Fn-1

    大家看看,是不是体现了”递推“的核心思想,代码也很简单。

    int month = 12;
    
                int[] fab = new int[month];
    
                fab[0] = 1;
    
                fab[1] = 1;
    
                //从已知条件出发推出结果
                for (int i = 2; i < month; i++)
                {
                    fab[i] = fab[i - 1] + fab[i - 2];
                }
    
                for (int i = 0; i < month; i++)
                {
                    Console.WriteLine("第{0}个月兔子为:{1}", i, fab[i]);
                }

    <2> 逆推的例子

           这个一个关于存钱的问题,一个富二代给他儿子的四年大学生活存一笔钱,富三代每月只能取3k作为下个月的生活费,采用的是整存零取的方式,

       年利率在1.71%,请问富二代需要一次性存入多少钱。

    思路: 这个题目是我们知道了结果,需要逆推条件, 第48月富三代要连本带息的把3k一把取走,那么

            第47月存款应为: (第48个月的存款+3000)/(1+0.0171/12(月));

            第46月存款应为: (第47个月的存款+3000)/(1+0.0171/12(月));

             .....                    .....

            第1个月存款应为: (第2个月的存款+3000)/(1+0.0171/12(月));

            

    复制代码
     1   //银行取钱问题
     2             double[] month = new double[49];
     3 
     4             ///最后一个月的连本带息是3000
     5             month[48] = 3000;
     6 
     7             double rate = 0.0171;
     8 
     9             //逆推
    10             for (int i = 47; i > 0; i--)
    11             {
    12                 month[i] = (month[i + 1] + month[48]) / (1 + rate / 12);
    13             }
    14 
    15             for (int i = 48; i > 0; i--)
    16             {
    17                 Console.WriteLine("第{0}个月末本利合计:{1}", i, month[i]);
    18             }
    复制代码

  • 相关阅读:
    [LeetCode] 90. 子集 II
    [LeetCode] 91. 解码方法
    [LeetCode] 89. 格雷编码
    [LeetCode] 88. 合并两个有序数组
    转:Google论文之三----MapReduce
    转:Google论文之二----Google文件系统(GFS)翻译学习
    转:Zend Framework 2.0 分析
    转:PHP include()和require()方法的区别
    转:cookie和session(二)——php应用
    转:cookie和session(一)——原理
  • 原文地址:https://www.cnblogs.com/mmcmmc/p/3946136.html
Copyright © 2020-2023  润新知