从Fibonacci出发小谈递归与循环

Fibonacci数列作为经典,以该方法简要看看递归和循环的区别

递归:艺术且直观,往往一个问题具备递归的规律的发觉是一件最核心也是最为考究的问题。

此处Fibonacci直接可表示为 f(n) = f(n-2)+f(n-1)  (n>=2)|  f(1)=f(0)=1

public static int f(int n){
	if(n<2)
		return 1;
	else
		return f(n-1)+f(n-2);
}
循环:理论上来说,所有的递归都可以用循环来实现,但由于递归思想的影响下,许多能轻松想到用递归方法求解的往往在实现循环的时候遇到困难。

此处Fibonacci简单实现为

public static int f2(int n){
	int result = 0;
	int a=1,b=1;
	for(int i=1;i<n;i++){
		result = a+b;
		a = b;
		b = result;
	}
	return result; 
}
很显然,循环相较于递归而言缺乏直观性,但单论该两种实现方式而言,实现递归固然简单,但带来的极大堆内存开销及便利时间则是成指数被增长,此时递归时间复杂度为O(n^2),而循环,一个for搞定O(n),通过实验测试
long time1 = System.currentTimeMillis();
int result = f(60000);
long time2 = System.currentTimeMillis();
System.out.println(result+"递归"+(time2-time1));
long time3 = System.currentTimeMillis();
int result2 = f2(60000);
long time4 = System.currentTimeMillis();
System.out.println(result2+"循环"+(time4-time3));
很显然,用递归要崩溃。

为此特地搜索网上关于递归与循环的评价,贴个知乎链接https://www.zhihu.com/question/20418254

个人认为:具体问题具体分析,如果实在用循环(中间值可以手动保存)解决不了,走递归吧。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值