zoukankan      html  css  js  c++  java
  • 一种递归<>数学转换的方法

      我们经常会用到递归的思想去解决问题,比如说经典的汉诺塔问题、斐波拉契数列问题、二叉树的递归遍历。。。。。

          虽然递归的思想比较直接容易,但是我们知道用递归的效率是很低的。所以我们也经常去探索将递归转换成迭代的方法,下面介绍一类问题的递归-数学转换:

    我们先来看这样一个情景:

      悟空喜欢吃桃,第一天悟空吃掉桃子总数一半多一个,
    第二天又将剩下的桃子吃掉一半多一个,
    以后每天吃掉前一天剩下的一半多一个,
    到第n天准备吃的时候只剩下一个桃子。
    聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?


    这个问题如果用递归的思想去做显得很简单,我们很容易得到他的递推公式:

    f[1] = 1;
    f[n] = (f[n-1]-1)/2;

    这个问题用迭代也很简单:

    1 for (int i = 1; i <= n; i++)
    2 {
    3     s = (s * 2) + 1;
    4 }

    下面提供一种数学方法,直接求出其结果:

    本题很容易得到它的递推方程:

    f(1) = 1;
    f(n) = [f(n-1) + 1] × 2;

    于是我们得到:

    f(n) + 2 = 2 × [f(n-1) + 2]
    f(1) + 2 = 3
    
    =>
    
    f(n) + 2 = 3 × 2
    n-1
    =>
    
    f(n) = 3 × 2
    n-1
    - 2
    

      当然上面是运用我们在高中就学过的数列的知识解决这个问题,对于这种推断题还有另外一种递推方法,虽然对于本题来说很麻烦。但有时候它是无可替代的。

    f(1) = 1;
    f(n) = 2f(n-1) + 2 = f(n-1) + 2f(n-2) + 4;
    
    =>
    
    f(n) + f(n-1) + 4 = 2 × [f(n-1) + f(n+2) + 4];
    
    设 g(n) = f(n) + f(n-1) + 4;
    
    则 g(n) = 2 × g(n-1);
       g(2) = f(2) + f(1) + 4 = 9;
    
    ∴g(n) = 9 × 2
    n-2
    (n > 1)
    
    ∴f(n)   + f(n-1) = 9 × 2
    n-2
     - 4	①
      f(n-1) + f(n-2) = 9 × 2
    n-3
    - 4	②
      ┋
      f(3)   + f(2)   = 9 × 2 - 4
      f(2)   + f(1)   = 9 - 4
    
    把①式减去②式得
      f(n)   = 9 × 2
    n-3
    + f(n-2)
      f(n-2) = 9 × 2
    n-5
    + f(n-4)
      ┋
    

    这时候,我们需要分类讨论了:

    1. n为奇数
        f(n)   = 9 × 2
      n-3
      + f(n-2)
        f(n-2) = 9 × 2
      n-5
      + f(n-4)
        ┋
        f(5)   = 9 × 2
      2
       + f(3)
        f(3)   = 9 + f(1)
        f(1)   = 1
      
      从下往上迭代,得:
        f(n) = 9 × (2
      n-3
       + 2
      n-5
       + ... + 2
      2
       + 1) + 1
      =>
        f(n) = 9 × (1 - 4
      (n-1)/2
      ) ÷ (1 - 4) + 1
      =>
        f(n) = 3 × 2
      n - 1
       - 2
      
    2. n为偶数
        f(n)   = 9 × 2
      n-3
       + f(n-2)
        f(n-2) = 9 × 2
      n-5
       + f(n-4)
        ┋
        f(4)   = 9 × 2
      1
       + f(2)
        f(2)   = 4
      
      从下往上迭代,得:
        f(n) = 9 × (2
      n-3
       + 2
      n-5
       + ... + 2
      1
      ) + 4
      =>
        f(n) = 9 × 2 × (1 - 4
      (n-2)/2
      ) ÷ (1 - 4) + 4
      =>
        f(n) = 3 × 2
      n - 1
       - 2
      

    现在我们就得到了这道题目的公式了: f(n) = 3 × 2n - 1 - 2

  • 相关阅读:
    Valgrind使用转载 Sanny.Liu
    Caffe模型读取 Sanny.Liu
    JNI动态库生成、编译、查看相关简易资料 Sanny.Liu
    GDB调试,转载一位大牛的东西 Sanny.Liu
    Android处理图片工具(转载) Sanny.Liu
    添加可点击的imagebottom,有个点击动画效果 Sanny.Liu
    去OpenCVManager,大部分为转载,仅当自己学习使用 Sanny.Liu
    转载: vim使用技巧 Sanny.Liu
    结构体数组初始化三种方法,转载 Sanny.Liu
    AsyncTask机制学习 Sanny.Liu
  • 原文地址:https://www.cnblogs.com/CocoonFan/p/3089990.html
Copyright © 2011-2022 走看看