Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2119803
  • 博文数量: 249
  • 博客积分: 1305
  • 博客等级: 军士长
  • 技术积分: 4733
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-17 10:37
个人简介

不懂的东西还有很多,随着不断的学习,不懂的东西更多,无法消灭更多不懂的东西,那就不断的充实自己吧。 欢迎关注微信公众号:菜鸟的机器学习

文章分类

全部博文(249)

文章存档

2015年(1)

2014年(4)

2013年(208)

2012年(35)

2011年(1)

分类: C/C++

2013-08-14 19:50:06


题目:
    You are climbing a stair case. It takes n steps to reach to the top.
    Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

解析:
    上面的题目其实很简单,首先推出递推公式为:
    
    这篇文章就是想总结下求解斐波那契数列的方法,有自己知道的,也有参考的其他的。主要目的还是学习。

解法一:递归
    相信遇到这个问题时,很多人都会首先想到的是递归方法,因为我们有递归方程,也有结束条件,很顺其自然的想到该方法。
  1. //递归方法
  2. int Fibonacci(int n)
  3. {
  4.     if(n == 0)
  5.     {
  6.         return 0;
  7.     }
  8.     else if(n == 1)
  9.     {
  10.         return 1;
  11.     }
  12.     else
  13.     {
  14.         return Fibonacci(n - 1) + Fibonacci(n - 2);
  15.     }
  16. }
    这种方法当n值比较小的时候,时间效率还行,但是,当n值很大时,效率非常低。

解法二:迭代
    根据解法一的递归,可以将其改写成迭代的方法。
  1. //迭代方法
  2. int Fibonacci(int n)
  3. {
  4.     int left = 1;    //n = 1
  5.     int right = 0; //n = 0
  6.     int sum = 0;

  7.     if(n == 0)
  8.     {
  9.         return right;
  10.     }
  11.     if(n == 1)
  12.     {
  13.         return left;
  14.     }
  15.     
  16.     for(int i = 2; i <= n; i++)
  17.     {
  18.         sum = left + right;
  19.         right = left;
  20.         left = sum;
  21.     }
  22.     
  23.     return left;
  24. }

解法三:求解递推公式
    如果我们知道一个数列的递推公式,使用公式来计算会更加容易。能不能把这个函数的递归公式求解出来?
    
    通过公式,我们可以在O(1)的时间内得到F(n)。但公式中引入了无理数,所以不能保证结果的精度。

解法四:分治策略
    注意到斐波那契数列是二阶递推数列,所以存在一个2*2的矩阵A,使得:
    
    我们注意到:
    
    
    主要代码如下所示。
  1. class Matrix;            //假设已经有实现乘法操作的矩阵类
  2. Matrix MatrixPow(const Matrix &m, int n)
  3. {
  4.     Matrix    result = Matrix::Identity;    //赋初值为单位矩阵
  5.     Matrix tmp = m;
  6.     for( ; n; n >>= 1)
  7.     {
  8.         if(n & 1)
  9.         {
  10.             result *= tmp;
  11.         }
  12.         tmp * tmp;
  13.     }

  14.     return result;
  15. }

  16. int Fibonacci(int n)
  17. {
  18.     Matrix an = MatrixPow(A, n - 1);    //A的值就是上面求解出来的
  19.     return F1 * an(0,0) + F0(1, 0));
  20. }


    上面的公式太难打了,所以,最后截了两张编程之美上的图。


    引自:解法三和解法四出自《编程之美》
    








阅读(2684) | 评论(0) | 转发(0) |
0

上一篇:STL容器之vector

下一篇:二分查找算法

给主人留下些什么吧!~~