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