剑指Offer+第9题+斐波那契数列+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));
	}
}

运行结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值