算法之递归和循环比较

递归的缺点
首先递归实现效率不如循环。
递归由于是函数调用自身,而函数调用要消耗空间和时间,每一次调用都需要在内存栈中分配空间,来保存参数、返回地址及临时变量,并且往栈里压入数据和弹出数据都需要时间。递归中有很多计算是重复的,因此带来很大的负面影响。其本质是把一个问题分解成两个和多个小问题,如果多个小问题存在相互重叠部分,就造成重复计算。
动态规划用递归分析问题,但由于递归分解的子问题存在大量重复,因此用自下而上的循环实现代码。
除效率之外,递归还有可能引起更严重问题——调用栈溢出。如前所述,每次函数调用在内存栈中分配空间,而每个进程栈的容量有限,当递归调用层级太多,就会超出栈的容量,导致调用栈溢出。

经典面试题
斐波那契数列
1.递归法(最low)时间复杂度以n的指数方式递增

long long Fibonacci_Solution1(unsigned int n)
{if(n <= 0)
    return 0;
if(n == 1)
    return 1;
return Fibonacci_Solution1(n - 1) + Fibonacci_Solution1(n - 2);
}

2、循环法(实用算法)时间复杂度O(n)

    long long Fibonacci_Solution2(unsigned n)
    { if(n < 2)
    return result[n];
    long long  fibNMinusTwo = 0;
    long long  fibN = 0;
    for(unsigned int i = 2; i <= n; ++ i)
   {
        fibN = fibNMinusOne + fibNMinusTwo;
        fibNMinusTwo = fibNMinusOne;
    }
 return fibN;

}
同类题目:青蛙跳台阶问题(详见剑指offer面试题10)
当n=1时,一种跳法,n=2时,两种跳法。把n级台阶跳法记为f(n)。当n>2时,第一次跳有两个选择:一是第一次跳一级,跳法总数等于后面n-1级台阶的跳法数目,记为f(n-1);二是,第一次跳2级,跳法总数等于后面剩下的n-2级跳法总数,记为f(n-2)。综上,n级台阶的跳法总数为f(n)=f(n-1)+f(n-2)。原理就是斐波那契数列。

发散思维,青蛙跳台扩展
1、把条件改为,青蛙可以跳一级,也可以跳2级。。。也可以跳n级,此时青蛙跳上一个n级台阶总共有多少跳法?数学归纳可以证明f(n)=2^n-1.
2、用8个2*1的小矩形无重叠覆盖一个2*8的大矩形,总共多少种方法。(详见剑指offer P79面)

猜你喜欢

转载自blog.csdn.net/amychang230_/article/details/81662388
今日推荐