算法之递归和循环比较

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

经典面试题
斐波那契数列
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面)

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值