循环和递归

循环和递归

剑指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;
}

`

猜你喜欢

转载自blog.csdn.net/u013164931/article/details/79790826