欢迎点击「算法与编程之美」↑关注我们!
本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。
1
理解递归
“程序设计是实践计算机思维的重要手段”。
程序设计的三种特征就是封装、继承和多态。而对于算法新手来说函数作为封装代码是最常见的,他既可以被内部函数调用也可以被其他程序调用。而这种调用自身的方式就称为递归。
举一个现实例子,照镜子时看到的自己就是递归。
递归算法在数学阶乘的计算中体现的淋漓尽致,阶乘是排列组合的结果,任何大于1的自然数n阶乘可以表示为:n!=1×2×3×……×n ,设得到的积是x,x就是n的阶乘。他的定义是
这个函数的实现必然是有规律的。通常来说,我们可以用循环的方式来解决,但循环设计会很复杂,加大了代码量。而仔细观察我们可以发现蕴含在定义中的递推原理,第二个数都是第一个数减1,一直到最后一个数为1,这说明阶乘计算的数都是比他小1的数的阶乘。还要注意的是,阶乘必须是在自然数的范围内,而对于特殊的自然数0,数学家规定为0!=1,所以0!=1!。
也正是因为0的特殊性,我们可以把阶乘按0与非0的标准来区分,也就得到以下表达式:
对于这个特殊的阶乘0!,我们称他为基例,也就是最小的且不需要计算求得的解。基例的重要性不言而喻,如果没有基例,就无法停止并推出递归。就像照镜子,如果没有本身的人就无法获得镜子里的影像。 所以这就得出了递归的两个特征:
(1)基例不需要递归
(2)递归式中必须有基例存在
2
阶乘计算
首先把阶乘当作一个普通的函数写出来,这里要运用到fact()函数,这个函数的意义就是把自身引用到函数内部中去。此时的基例就是0,代码如下
输出结果如下
3
字符串反转实例
算法最重要的是思维,有了递归的思想,字符串反转这个简单的实例也可以轻而易举的用递归算法来实现啦!
实现反转所运用到的函数就是reverse()函数。而这里的递归对象就是字符串,结合阶乘,将字符串分成两个部分,首字符和其他字符。代码如下:
点击运行后却发现报错了,这是为什么呢?错误提示说:代码超过了最大递归深度1000层。这里的最大递归深度是程序为了防止递归无限错误而设计的。之前强调过基例的作用,而这里出现错误的原因就是因为没有基例。基例是最小的字符串概念,也就是“没有字符”,在这里不输入任何字符就可以了。
可以实现字符反转的代码如下:
4
总结
在递归算法中涉及到的知识点就是函数与代码复用的知识点。其实编程的目的就是减轻人类的负担,在程序设计的时候一定要多多思考,注意细节!
更多精彩文章:
答粉丝问|Python中模块导入方法的比较
如何下载付费音乐
从1到100求和学算法思维(六)
开发|关于微信小游戏开发的入门心得
JAVA|关于同步和异步的区别
Web|如何实现导航栏的默认,预览以及选中时的样式
where2go 团队
微信号:算法与编程之美
长按识别二维码关注我们!
温馨提示:点击页面右下角“写留言”发表评论,期待您的参与!期待您的转发!