首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

fibonacci数列和跳台阶有关问题

2012-10-12 
fibonacci数列和跳台阶问题首先百度之后知道,fibonacci数列其实在科学中有着广泛的应用,下面一句话引子百

fibonacci数列和跳台阶问题

首先百度之后知道,fibonacci数列其实在科学中有着广泛的应用,下面一句话引子百度百科:在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用。
了解fibonacci数列的人都知道它的推到公式:
   0                       n=0
f(n)=1                       n=1
         f(n-1)+f(n-2)   n>=2
有时候遇到的问题是如何求解fibonacci数列的各项的值,我记得有两种方法,就是递归方法和应用循环的方法。下面给出两种程序的代码:

#include<stdio.h>#include<assert.h>struct Matrix2By2{int m_00;int m_01;int m_10;int m_11;Matrix2By2(int m00=0,int m01=0,int m10=0,int m11=0):m_00(m00),m_01(m01),m_10(m10),m_11(m11){}};Matrix2By2 MatrixMultiply(const Matrix2By2& matrix1,const Matrix2By2& matrix2){return Matrix2By2(            matrix1.m_00 * matrix2.m_00 + matrix1.m_01 * matrix2.m_10,            matrix1.m_00 * matrix2.m_01 + matrix1.m_01 * matrix2.m_11,            matrix1.m_10 * matrix2.m_00 + matrix1.m_11 * matrix2.m_10,            matrix1.m_10 * matrix2.m_01 + matrix1.m_11 * matrix2.m_11);}Matrix2By2 MatrixPower(unsigned int n){assert(n>0);    Matrix2By2 matrix;if(n==1)matrix=Matrix2By2(1,1,1,0);else if(n%2==0){matrix=MatrixPower(n/2);matrix=MatrixMultiply(matrix,matrix);}else if(n%2==1){matrix = MatrixPower((n - 1) / 2);        matrix = MatrixMultiply(matrix, matrix);        matrix = MatrixMultiply(matrix, Matrix2By2(1, 1, 1, 0));}return matrix;}int fibonacci_solution(unsigned int n){      int result[2] = {0, 1};      if(n < 2)            return result[n];      Matrix2By2 PowerNMinus2 = MatrixPower(n - 1);      return PowerNMinus2.m_00;}void main(){unsigned int n;printf("input n value:");scanf("%d",&n);printf("%d\n",fibonacci_solution(n));}
运行,能得到正确的结果。就像题目所说,给我fibonacci在我们计算机中的一个应用吧,就是跳台阶的问题。给定n个台阶,有两种选择,就是一次可以跳一个台阶,还有是一次可以跳两个台阶。求总共有多少总跳法,并分析算法的时间复杂度。把n级台阶时的跳法看成是n的函数,记为f(n)。当n>2时,第一次跳的时候就有两种不同的选择:一是第一次只跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1);另外一种选择是第一次跳2级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即为f(n-2)。因此n级台阶时的不同跳法的总数f(n)=f(n-1)+(f-2)。

    我们把上面的分析用一个公式总结如下:
        /  1                             n=1
f(n)=      2                          n=2
        \  f(n-1)+(f-2)            n>2

如果有三种选择就是一次可以分别跳1,2,3,次的话,这个递推式就可以写成:f(n)=f(n-1)+f(n-2)+f(n-3).


热点排行