剑指offer 面试题9:斐波那契数列

1.题目:求斐波那契Fibonacci数列
            求函数f(n)    =  0                            n = 0
                                   =  1                            n = 1
                                   = f(n-1) + f(n-2)      n > 1
算法分析:
          算法1,采用递归调用方法。利用递归调用return compute1(n-1) + compute1(n-2);来计算出最终的结果。采用递归调用时,对于输入n较小的情况可行, 当n逐渐增大时,计算的时间会明显增加,时间复杂度为n的指数方式增长。
          算法2.采用倒叙计算方法。递归调用方法慢的原因是重复计算太多,采用从下往上计算方法会明显减少重复。 首先根据f(0)和f(1)算出f(2),再根据f(1)和f(2)算出f(3)……依次类推就可以算出第n项了。这种思路的时间复杂度为O(n).
2.相似算法题:青蛙跳台阶。一只青蛙一次可以跳1级台阶,也可以跳2级台阶,求该青蛙跳上一个n级台阶总共有多少种跳法。
算法分析:
          如果只有1级台阶,则只有1种跳法,如果有n级台阶,当n>2时,第一次跳就有两种不同的选择,一时第一次只跳1级,此时跳法的数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1);另外一种选择是第一次跳2级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即为f(n-2)。因此n级台阶的不同跳法总数f(n)= f(n-1)+f(n-2),实际上就是斐波那契数列。
注意:在运行程序时,分别注释compute_fibonacci1.print(45);和compute_fibonacci2.print(45);,这样就可以明天体现出时间快慢。

Java代码实现:

/**************************************************************      
* Copyright (c) 2016, 
* All rights reserved.                   
* 版 本 号:v1.0                   
* 题目描述:求斐波那契Fibonacci数列
* 		     求函数f(n)=  0           		n = 0
* 					=  1		   		n = 1
* 					= f(n-1) + f(n-2)   n>1
* 输入描述:无
* 程序输出: Fibonaccci2数列计算的结果是:
*			1.13490317E9
*
* 问题分析:无
* 算法描述:
* 			算法1,采用递归调用方法。利用递归调用return compute1(n-1) + compute1(n-2);来计算出最终的结果。采用递归调用时,对于输入n较小的情况可行,
* 			当n逐渐增大时,计算的时间会明显增加,时间复杂度为n的指数方式增长。
* 			算法2.采用倒叙计算方法。递归调用方法慢的原因是重复计算太多,采用从下往上计算方法会明显减少重复。
* 			首先根据f(0)和f(1)算出f(2),再根据f(1)和f(2)算出f(3)……依次类推就可以算出第n项了。这种思路的时间复杂度为O(n).
* 			注意:在运行程序时,分别注释compute_fibonacci1.print(45);和compute_fibonacci2.print(45);,这样就可以明天体现出时间快慢
* 完成日期:2016-08-02
***************************************************************/
package org.marsguo.offerproject;
/*Compute_Fibonacci1类简单采用递归调用的方法,对于输入的n较小的情况下可行,
 * 对大于40的计算会明显变慢,时间复杂度为n的指数方式递增*/
class Compute_Fibonacci1{
	public double compute1(double n){
		if(n<2){
			return n;
		}else{
			return compute1(n-1) + compute1(n-2);				//进行递归调用,返回调用后的值
		}
	}
	public void print(double n){
		System.out.println("Fibonaccci1数列计算的结果是:");
		System.out.println(compute1(n));
	}
}
/*Compute_Fibonacci2类从下往上计算,首先根据f(0)和f(1)算出f(2),再根据f(1)和f(2)算出f(3)……依次类推就可以算出第n项了。这种思路的时间复杂度为O(n).*/
class Compute_Fibonacci2{
	public double compute2(double n){
		if(n<2){
			return n;
		}else{
			double fibOne = 1;
			double fibTwo = 0;
			double fibSum = 0;
			for(double i = 2; i <=n; i++){
				fibSum = fibOne + fibTwo;
				fibTwo = fibOne;
				fibOne = fibSum;
			}
			return fibSum;
		}
	}
	public void print(double n){
		System.out.println("Fibonaccci2数列计算的结果是:");
		System.out.println(compute2(n));
	}
}
public class Fibonacci {
	public static void main(String[] args){
		Compute_Fibonacci1 compute_fibonacci1 = new Compute_Fibonacci1();
		//compute_fibonacci1.print(45);
		Compute_Fibonacci2 compute_fibonacci2 = new Compute_Fibonacci2();
		compute_fibonacci2.print(45);
	}
}
程序运行结果:

不重要,主要看运行时间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值