剑指Offer(java+第九题,斐波那契数列)

思路

  如果直接写递归函数,由于会出现很多重复计算,效率非常底,不采用。

  要避免重复计算,采用从下往上计算,可以把计算过了的保存起来,下次要计算时就不必重复计算了:先由f(0)和f(1)计算f(2),再由f(1)和f(2)计算f(3)……以此类推就行了,计算第n个时,只要保存第n-1和第n-2项就可以了。

书里面有同时提到了两个问题:

1:青蛙跳台阶;

2:矩形匹配问题

(实际上就是斐波那契数列,这里不做赘述)

代码:

public class Offer09 {
	
	//递归,效率很低,面试官不会喜欢
	public long Fibonacci_Recursive(int n){
		if(n<=0)
			return 0;
		if(n==1)
			return 1;
		return Fibonacci_Recursive(n-1) + Fibonacci_Recursive(n-2);
	}
	
	//时间复杂度O(n),主要看这个
	public long Fibonacci(int n){
		int result[] = {0,1};
		if(n<2)
			return result[n];
		long fibNMinusOne = 1;
		long fibNMinusTwo = 0;
		long fibN = 0;
		for(int i = 2;i<=n;i++){
			fibN = fibNMinusOne + fibNMinusTwo;
			fibNMinusOne = fibN;
			fibNMinusTwo = fibNMinusOne;
		}
		return fibN;
	}
	
	public static void main(String[] args) {
		
		Offer09 of9 = new Offer09();
		
		//测试用例
		//1,功能测试(如输入3,5,10等)
		int n1 = 3;
		System.out.println("输入数字:"+n1+", 输出结果:"+of9.Fibonacci(n1));
		int n2 = 5;
		System.out.println("输入数字:"+n2+", 输出结果:"+of9.Fibonacci(n2));
		int n3 = 10;
		System.out.println("输入数字:"+n3+", 输出结果:"+of9.Fibonacci(n3));
		
		//2,边界值测试(如输入0,1,2)
		int n4 = 0;
		System.out.println("输入数字:"+n4+", 输出结果:"+of9.Fibonacci(n4));
		int n5 = 1;
		System.out.println("输入数字:"+n5+", 输出结果:"+of9.Fibonacci(n5));
		int n6 = 2;
		System.out.println("输入数字:"+n6+", 输出结果:"+of9.Fibonacci(n6));
		
		//3,性能测试(输入较大的数字,如40,50,100等)
		int n7 = 40;
		System.out.println("输入数字:"+n7+", 输出结果:"+of9.Fibonacci(n7));
		int n8 = 50;
		System.out.println("输入数字:"+n8+", 输出结果:"+of9.Fibonacci(n8));
		int n9 = 100;//运算结果超出了long的范围,故输出为0
		System.out.println("输入数字:"+n9+", 输出结果:"+of9.Fibonacci(n9));
	}
}

运行结果:

猜你喜欢

转载自blog.csdn.net/Quantum_Dog/article/details/86226545