递归经典问题(乌龟跳台阶)

题目:

有一只乌龟,他要跳上一定阶数的台阶,每次只能跳1或2格,问有几种跳法。

分析:

可以将问题拆分为,乌龟每次跳跃都有跳1格或2格的可能。那么跳过某一台阶,只要解决乌龟跳过1格后有几种可能加上乌龟跳过2格后有几种可能即可,这种解法就是递归。终止条件为乌龟距离终点还剩0格或1格,此时就是一种路线。

解答:

我上方的终止条件为距离终点只剩1格或2格。只剩1格那么就只能跳一格。剩2格那么就有跳一格与跳2格两种可能(也可以直接写距离终点剩1或0格时返回1)。从写法上来看,我们可以发现使用递归解决这个问题十分轻松,并且短短几行就可以解决这个问题,换其他方法可能感觉无从下手。

递归的缺点:

递归的思想为大事化小,类似多米诺骨牌。虽然可以帮助我们较为轻松的解决一部分复杂的问题,但是容易导致栈溢出的问题,同时运算过程也非常的慢。所以可以适当地使用递归,但不能过于依赖。

递归容易导致堆栈,造成大量内存浪费,所以我们最好使用尾递归。

尾递归:

尾递归实在递归函数的最后才调用自身。可以这么理解,一个递归函数,他在运算的过程中突然要调用自身,那么就需要拿出部分空间来实现新一轮递归。而尾递归则是将递归函数置于最后,在最后一步返回的时候执行递归。这可以节省不少空间。

尾递归使用场景:

直接看案例。

对于尾递归函数,他的返回值就是wdg(n-1,a*n),那么上一级尾递归函数就可以直接没掉了。

但对于递归函数,他的返回值为n*dg(n-1),他的返回值需要先算出dg(n-1)然后才可以乘上n返回一个值,因此下一级递归函数运算时仍要保留上一级,这就相当于空间浪费了。

总结:

递归是将大事化小,并且逐渐趋向退出条件的函数。我们使用递归往往可以很轻松的解决一个麻烦的问题。但同时也要注意递归使用时可能造成的浪费现象,多使用尾递归代替递归,这也相当于一种优化。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值