对递归的一些认识

昨晚看了公众号“非著名程序员”上的文章《程序员平时从这几点做起,可以增加面试成功率》,里面提到经常写博客是一个很好的习惯,所以我也想尝试着把自己最近的学习心得整理一下写进博客。

我的这个博客文章不多,开了很多年了,一直没什么用处;其实各种文章都有,有转发的,有经济类的,有知乎上的回答,也有随笔、荒诞的高考作文,现在它又要多一个分类了,那就是技术文章。

最近在跟斯坦福的CS106B抽象编程课程(Programming Abstraction),一门深入介绍编程核心思想的课,网易公开课上的视频都是11年的,跟现在的课程表又出入很大了,再加上Zelensky的讲课不是很生动,我就放弃看视频,用阅读教材和独立编程的方法进行学习。BTW, 教材名字叫做Programming Abstraction in C++​, 有需要的同学可以向我索要,书是英文版的。

递归我一直觉得是个很有趣的东西,用它来解决问题很方便,代码很简介,甚至可以说很优雅,有种高端大气的感觉。但是学校里的老师并没有很乐于讲授递归算法,这可能与学校里没有抽象编程类似课程有关,我听到更多的不是在赞扬递归,反而是在挑毛病,说它有可能使运行时间延长,占用资源过多,有一个老师上课的时候说他上大学的时候,他的老师让他们每写一个递归程序就要用非递归的方法再来实现一次,总之,我得到了很多对于递归的负面评价。

最近阅读Programming Abstraction in C++有种返璞归真的体验,我对递归最初的看法在这里得到的共鸣,Eric Roberts大肆赞扬递归的各种优点。然后我学到了一种叫做递归思想的东西,英文名:recursive insight.

这种思想是这样的,当你打算去理解一个递归或者设计一个的时候,切记不要去过分关注细节,不要去担心它每一步是怎么进行的,因为这种方式会让你精疲力竭,最终也得不到好的结果。理解递归更重要的是两方面的东西,第一是简单情况,当问题一步步分解下去,你需要定义一个可行的简单情况,比如阶乘(factorial)

int fact(int n) {

if (n = 0) {
return 1;
} else {
return n * fact(n - 1);
}}​


n = 0的时候就是所谓的简单情况;第二就是问题的分解,你要关心的时候算法设计的时候有没有把问题的规模减小,阶乘的例子里就是原先规模是n,下一次就是n - 1了,这是明显的规模减小;如果两方面情况都满足,你就可以认定​这个递归算法是可行的,当你自己设计递归的时候,也是从这两个方面出发。

书后面有一个章节用递归实现了科赫雪花,特别漂亮,我也照做了一次,语言是C++,IDE是Qt Creator,用的库是斯坦福的标准库,可能与市面上通用的库不太一样,但代码还是非常简明易懂的,我贴出来大家看看,就当娱乐一下。

对递归的一些认识_第1张图片

你可能感兴趣的:(算法)