递归算法经典实例_深度解析递归

7fe70a1a1af1678f831db1b260222b6e.png

程序设计和LeetCode刷题过程中,可能经常会与递归这个剑客狭路相逢,而作为程序设计师当然是我们胜出啦。。。言归正传,我们的目的是要利用递归算法完成一些操作,描述出解题过程所需要的多次重复计算,从而减少了程序的代码量。关于递归的正式定义百度中有两个,我选择了一个一个比较容易理解的定义:递归,就是在运行的过程中调用自己。另外一个感兴趣的同学可以自己检索。定义出来以后其实还是很不好理解,到底怎么自己调用自己呢?

其实这个问题我们可以将它抽象成生活中的例子来理解,假如妈妈是个顶级大厨,需要你将洋葱剥至最后一层,她要用最后一层,做出菜品最好吃的部分,剩下的拿来炒菜。顶级大厨对于数量要求极其严格所以她需要知道洋葱的层数。其实递归的过程和剥洋葱很像。从外面看我们压根不知道洋葱有多少层,剥开一层还有一层,我们需要不停的剥才能到最后一层,找到母亲最想要的那部分洋葱,这个时候我们才知道到底有多少层洋葱。

6e3876511bb55a2a1ba2f7584a7095f1.png

到这里我们已经将递归的定义和含义抽样为妈妈让我剥洋葱的故事了,但是,光这个例子想要真正理解递归并应用那是做梦,所以接下来我们再看一个经典的递归例子:求N的阶乘。

def NoRder():
    if(n==1): #剥到了最后一层洋葱
       return 1
    return NoRder(n-1)*n #从这里开始剥第一层的洋葱(自己调用自己)

到这里我们就可以直观的看到洋葱被一层一层剥开的整个过程,一直到最后一层被取出,然后整个事件结束(函数功能实现完成)。

这时相信你在脑海中已经有了递归的基础模型和大致印象,接下来让我们再将递归进一步剖析,步入递归的本质层面理解它,递归中有三要素:

第一:使用递归的函数一定要有一个目的。

第二:递归的边界条件(退出条件)一定要找到 ps:有一定难度。

第三:要找到函数的等价关系。

我们一条一条来看,还是以我们剥洋葱的故事结合求N的阶乘这两个内容为例:第一,N的阶乘这个函数的目的非常清晰,就是对于给定参数算出N的阶乘,对应剥洋葱例子里面妈妈让我剥洋葱用来炒菜这个事件。第二,递归退出的边界条件在N的阶乘内是n==1,对应剥洋葱中的最后一层洋葱。第三,关于等价关系N的阶乘中 最后一行 NoRder(n-1)*n这个关键语句 等价于数学中的N!,这条在剥洋葱中并不好解释,所以暂时不做解释,(大家有什么好的想法欢迎留言)到了这里就是递归的掌握阶段了,结合剥洋葱和N阶乘这个两个内容讲清楚递归的三要素,这三要每个递归算法都有,并且可以作为设计递归算法的重要步骤,要牢记于心。

清楚了这些东西就够了吗?就可以着手设计递归算法了吗?当然大神可以,大部分的同学可能还不行,所以得先练,从生疏到熟悉再到得心应手这是一个过程,我们大部分人没有那个天分还是的安安心心多练。此外关于尾递归和深度以及广度优先,有兴趣的同学可以自己去查查看,这部分内容也比较复杂,也欢迎知道的大佬分享出来。

最后再和大家分享一篇文章,这是小编写完这篇文章之后发现的,里面有两个的模版可以套用,另外,这篇文章中还有大量的实例供大家练习,同时还有一些关于递归的内容讲解的很精彩,比小编理解的更加到位和专业,小编也是学习。希望大家一起进步,一起加油。

https://blog.csdn.net/ds1130071727/article/details/80431276​blog.csdn.net
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值