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);
}
}
程序运行结果:
不重要,主要看运行时间