茶艺师学算法打卡5: 递归
前言
"编写递归代码的关键是,只要遇到递归,我们就把它抽象成一个递推公式,不用想一层层的调用关系,不要试图用人脑去分解递归的每个步骤。"
学习笔记
- 递归,是两个动作,“递”与“归”。“递”是指把问题往上或者往下传递,“归”是指把问题答案沿着反方向返回来,文章中老师举的“在电影院问座位排号”例子就能把这个过程说的很形象。
- 递归的代码能写得很短很精妙,甚至有种美感,在刷算法题时,看着大神的示范代码时,就有种在看艺术品的感觉。既然能拿“艺术品”来比喻,这表明递归也有另外一面:难,不仅是难看得懂难理解,本身就是难写难写对。
- 这里大家,包括我,得好好听专栏老师的一句劝,“如果一个问题 A 可以分解为若干子问题 B、C、D,你可以假设子问题 B、C、D 已经解决,在此基础上思考如何解决问题 A。而且,你只需要思考问题 A 与子问题 B、C、D 两层之间的关系即可,不需要一层一层往下思考子问题与子子问题,子子问题与子子子问题之间的关系。屏蔽掉递归细节,这样子理解起来就简单多了。”
- 在现实中,像使用递归写法,除了上面的,还有更多的现实问题:会不会爆栈?会不会爆内存?会不会有重复计算?会不会花很多时间?......
- 在这里我分享一个自己在用的递归模板
- 递归终止条件
- 处理本层逻辑
- 往下一层
- 如有需要,恢复当前层的状态
- 存在“尾递归”的优化手法,如果自己使用的语言支持该能力,那就这么写吧。
结语
刷算法题时难写,在现实中也得慎重又慎重的写法,还有什么学的必要?
我自己学得也不是十分明白,但我觉得还是有必要的。
正如老师所说,“递归”才是计算机擅长的事情。
如果连这都不好好了解,那还说什么“欲善其工,必利其器”呢?