题目:定义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. Zookeeper 5、Zookeeper应用场景

    应用场景1 .统一命名服务 » 分布式应用中,通常需要有一套完整的命名规则,既能够产生唯一的名称又便于人识别和记住,通常情况 下用树形的名称结构是一个理想的选择,树形的名称结构是一个有层次的目录结构, ...

  2. ThinkPHP中的__initialize()和类的构造函数__construct()

    ThinkPHP中的__initialize()和类的构造函数__construct()网上有很多关于__initialize()的说法和用法,总感觉不对头,所以自己测试了一下.将结果和大家分享.不对 ...

  3. 【组合数学:第一类斯特林数】【HDU3625】Examining the Rooms

    Examining the Rooms Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  4. visual studio 2010 C语言声明异常

    如下这段程序,是C_Primer_plus_第五版内的一个复习题答案(感觉声明i的值有问题),在GCC上面可以运行,但是移植到VS2010就一堆错误, #include<stdio.h> ...

  5. 每日一发linux命令

    很多用虚拟机的同学在向/tmp目录下进行解压的时候,会发现之前挂载的此目录空间不足,导致下一步无法进行(我在vmwaretools解压的时候就遇到了这个problem)…… 实际上,/tmp是可以进行 ...

  6. TCP协议三次握手

    TCP协议三次握手过程分析 TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: ...

  7. NET基础课--应用程序编译和执行1

  8. OSError: [Errno 13] Permission denied: '/etc/cron.d/1sandbox_registration'

    使用Hortonworks 的twitter tutorial: http://hortonworks.com/hadoop-tutorial/how-to-refine-and-visualize- ...

  9. Android开发_关于点击事件

    为了防止用户或者测试MM疯狂的点击某个button: 创建一个工具类 public class Tools { private static long lastClickTime; public st ...

  10. cisco asa5520 IOS故障恢复

    在ASA5520上误删除了IOS 把一台电脑IP 设置成192.168.2.2 255.255.255.0 把IOS的BIN文件复制到这台电脑上,并安装一个CISCO TFTP SERVER V1.1 ...