题目:定义Fibonacci数列例如以下:

/    0                      n=0

f(n)=      1                      n=1

        \    f(n-1)+f(n-2)          n=2

输入n,用最快的方法求该数列的第n项。

分析:刚看到这道题的时候,还以为怎么会有这么简单,汗,原来理所当然的使用的递归,时间复杂度太大,看看以下这段递归代码。

public static int fun(int n){
if(n==0) return 0 ;
else if(n==1) return 1 ;
else return (fun(n-1)+fun(n-2)) ;
}

大家来分析下,比方要求f(10),那么他的 运算步骤例如以下图:

f(10)

               /        \

            f(9)         f(8)

          /     \       /    \

       f(8)     f(7)  f(7)   f(6)

      /   \     /   \ 

   f(7)  f(6)  f(6) f(5)

从上面的树状结构中就能够知道利用递归的方法会有很多反复的节点,并且n越大反复节点越多。他的时间复杂度是以n的指数的方式递增的。

那么要做的优化,第一个想到的就是去除反复,怎样去除呢?我们能够从f(0),f(1)開始运算,利用循环来按顺序求出f(n)。这种时间复杂度是O(n),代码例如以下

public static int fun1(int n){
int fib1 = 0 ;
int fib2 = 1 ;
int fibsum = 0 ;
if(n<0) System.out.println("error") ;
else if(n==0) return 0 ;
else if(n==1) return 1 ;
else{
for(int i=1;i<n;i++){
fibsum = fib1 + fib2 ;
fib1 = fib2 ;
fib2 = fibsum ;
}
}
return fibsum ;
}

总结:谨慎使用递归。

《面试题精选》15.O(logn)求Fibonacci数列的更多相关文章

  1. 程序员面试题精选100题(16)-O(logn)求Fibonacci数列[算法]

    作者:何海涛 出处:http://zhedahht.blog.163.com/ 题目:定义Fibonacci数列如下: /  0                      n=0 f(n)=      ...

  2. 16.O(logn)求Fibonacci数列[Fibonacci]

    [题目] log(n)时间Fib(n),本质log(n)求a^n. [代码]  C++ Code  12345678910111213141516171819202122232425262728293 ...

  3. 用PL0语言求Fibonacci数列前m个中偶数位的数

    程序说明:求Fibonacci数列前m个中偶数位的数: 这是编译原理作业,本打算写 求Fibonacci数列前m个数:写了半天,不会写,就放弃了: 程序代码如下: var n1,n2,m,i; pro ...

  4. C++项目參考解答:求Fibonacci数列

    [项目:求Fibonacci数列] Fibonacci数列在计算科学.经济学等领域中广泛使用,其特点是:第一.二个数是1,从第3个数開始,每一个数是其前两个数之和.据此,这个数列为:1 1 2 3 5 ...

  5. 求Fibonacci数列通项公式

    0. Intro \[f_n=\begin{cases} 0 & (n=0) \\ 1 & (n=1) \\ f_{n-1}+f_{n-2} & (n>1) \end{c ...

  6. 用Python实现求Fibonacci数列的第n项

    1. 背景——Fabonacci数列的介绍(摘自百度百科): 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacc ...

  7. POJ ---3070 (矩阵乘法求Fibonacci 数列)

    Fibonacci   Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2  ...

  8. POJ-3070Fibonacci(矩阵快速幂求Fibonacci数列) uva 10689 Yet another Number Sequence【矩阵快速幂】

    典型的两道矩阵快速幂求斐波那契数列 POJ 那是 默认a=0,b=1 UVA 一般情况是 斐波那契f(n)=(n-1)次幂情况下的(ans.m[0][0] * b + ans.m[0][1] * a) ...

  9. 用数组求Fibonacci数列

    #include<stdio.h>int main(){      int a[20]={1,1};      int n=2,i;      for(n=2;n<20;n++)  ...

随机推荐

  1. Java有用经验总结--Swing篇

    Java有用经验总结--Swing篇 前言 本文前言部分为我的一些感想,假设你仅仅对本文介绍的Java有用技巧感兴趣,能够跳过前言直接看正文的内容. 本文的写作动机来源于近期接给人家帮忙写的一个小程序 ...

  2. dom4j解析XML的CURD操作

    在开发JavaWeb项目中通常是利用XML配置文件来提高应用程序的访问效率,而在配置XML的同时,更多时候是对XML进行解析. 一.解析XML配置文件有两种机制: DOM和SAX的机制: DOM是将整 ...

  3. Qt开始学习的一些问题

    1.需要将qmake.moc和qvfb的路径加入到系统的环境变量: qmake.moc:export PATH=$PATH:/usr/local/Trolltech/QtEmbedded-4.6.1- ...

  4. sql server去除重复信息,

    SELECT st_id FROM ( SELECT *,ROW_NUMBER() OVER( PARTITION BY st_code ORDER BY st_code ) AS num FROM ...

  5. HTML之学习笔记(二)颜色体系

    html页面的颜色表示法有三种:英文表示,16进制表示和10进制表示.颜色通过三原色即红.绿.蓝三种按比例混合而成,如红色的10进制表示为255,0,0,即按照红色.绿色.蓝色的格式,权值取0~255 ...

  6. 查看Android数据库文件

    使用Eclipse DDMS的File Explorer不能能看到Data目录下面的东西,可能由下面原因引起的 手机没有Root  -- 可以使用Root大师 Data文件权限不够 -- 可以使用Ro ...

  7. EntityFramework sum嵌套

    一个查询中 用到了 sum , 可是返回结果的小数有很多位 , 都不准确了..类似js中的小数运算一样...不太熟悉C#,不知道这问题是因为double的关系 , 还是因为代码写的问题 , 通过 sq ...

  8. What is SignalR and Why Should I Use It?

    原文地址: What is SignalR and why should I use it? When I first heard about SignalR, I was not sure what ...

  9. html ul li 显示数据库

    方法1: function insert() { var str=""; var data="你的数据库数据"; str="<ul>< ...

  10. B - Maya Calendar(第二季水)

    Description During his last sabbatical, professor M. A. Ya made a surprising discovery about the old ...