LintCode(1):递归、斐波那契

在了解了Java的虚拟机内存模型后,就理解了方法调用的过程。

方法调用:就是将参数、局部变量等信息压入Java方法栈中,因此,随着方法调用深度增加,方法栈也会越来越深。


一:用递归方式实现斐波那契数列,这种方式由于大量重复计算,会导致效率极低。

//递归方式实现斐波那契
	public int fibonacciByRecursion(int n) {
		if(n==1){
			//递归的结束条件
			return 0;
		}else if(n==2){
			//递归的结束条件
			return 1;
		}else if(n>2){
			//递归的本质就是自我调用,不断分解问题
			return fibonacciByRecursion(n-1)+fibonacciByRecursion(n-2);
		}else{
			//如果输入小于1的整数,则输出0
			return 0;
		}
	}

二:用递推实现斐波那契,效率较高。

public int fibonacciByCircle(int n){
		//表示第一个数和第二个数,这是初始条件
		int i=0,j=1,sum=0;
		if(n<=2){
			return n-1;
		}else{
			//开始循环
			for(int k=3;k<=n;k++){
				//求出这次循环的结果 
				sum=i+j;
				//为下一次循环更新数据
				i=j;
				j=sum;
			}
			return sum;
		}
	}


三:用尾递归实现斐波那契,效率接近递推,这种方式不会耗费大量栈内存,只会耗费固定内存,而且没有重复计算,本质与递推类似

//尾递归方式实现斐波那契
	public int fibonacciByTailRecursion(int n,int i,int j) {
		if(n==1){
			//递归的结束条件
			return i;
		}else if(n==2){
			//递归的结束条件
			return j;
		}else if(n>2){
			//每次n减1就是运算一次,然后更新i和j,这里的计算和参数共同构成迭代
			return fibonacciByTailRecursion(n-1,j,i+j);
		}else{
			//如果输入小于1的整数,则输出0
			return 0;
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值