循环和递归
剑指offer
通常基于递归实现的代码比基于循环实现的代码要简洁很多,更加容易实现。如果面试官没有特殊要求,则优先采用递归方法编程。
递归的优点是简洁。
缺点:递归由于是函数调用自身,而函数调用时有时间和空间的消耗的;每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址及临时变量,而且往栈里面压人数据和弹出数据都需要时间。还有更严重的问题:调用栈溢出。
斐波那契数列
f(0)=0 当n=0
f(1)=1 当n=1
f(n)=f(n-1)+f(n-2) n>1
`
public Long Fibonacci(long n){
if(n==1||n==0){
return n;
}
return Fibonacci(n-1)+Fibonacci(n-2);
}
`
显然这样些很简洁,但是效率上不好,会计算重复值。说实话我以前也没想太多这个问题,看了剑指offer后才发现 自己好菜。
如上图计算了很多重复值。
改善重复值的计算(非递归)
`
public Long Fibonacci(long n){
if(n==1||n==0){
return n;
}
long fibNumOne=0;
long fibNumTwo=1;
long fibN=0;
for(long i=2;i<=n;i++){
fibN=fibNumOne+fibNumTwo;
fibNumOne=fibNumTwo;
fibNumTwo=fibN;
}
return fibN;
}
`