求n的阶乘的算法框图_算法|从阶乘计算看递归算法

欢迎点击「算法与编程之美」↑关注我们!

本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。

1

理解递归

“程序设计是实践计算机思维的重要手段”。

程序设计的三种特征就是封装、继承和多态。而对于算法新手来说函数作为封装代码是最常见的,他既可以被内部函数调用也可以被其他程序调用。而这种调用自身的方式就称为递归。

举一个现实例子,照镜子时看到的自己就是递归。

递归算法在数学阶乘的计算中体现的淋漓尽致,阶乘是排列组合的结果,任何大于1的自然数n阶乘可以表示为:n!=1×2×3×……×n ,设得到的积是x,x就是n的阶乘。他的定义是

3e69f33bbd972e18af517e60b3fbf3af.png

这个函数的实现必然是有规律的。通常来说,我们可以用循环的方式来解决,但循环设计会很复杂,加大了代码量。而仔细观察我们可以发现蕴含在定义中的递推原理,第二个数都是第一个数减1,一直到最后一个数为1,这说明阶乘计算的数都是比他小1的数的阶乘。还要注意的是,阶乘必须是在自然数的范围内,而对于特殊的自然数0,数学家规定为0!=1,所以0!=1!。

也正是因为0的特殊性,我们可以把阶乘按0与非0的标准来区分,也就得到以下表达式:

e1d7d7d5e628adc5a2f3491fdb7d6d25.png

对于这个特殊的阶乘0!,我们称他为基例,也就是最小的且不需要计算求得的解。基例的重要性不言而喻,如果没有基例,就无法停止并推出递归。就像照镜子,如果没有本身的人就无法获得镜子里的影像。 所以这就得出了递归的两个特征:

(1)基例不需要递归

(2)递归式中必须有基例存在

2

阶乘计算

首先把阶乘当作一个普通的函数写出来,这里要运用到fact()函数,这个函数的意义就是把自身引用到函数内部中去。此时的基例就是0,代码如下

58ff56e39d1fc25e4d6412e05e6c91e1.png

输出结果如下

2d8b5c8c190fcc420246b0b252e0914f.png

3

字符串反转实例

算法最重要的是思维,有了递归的思想,字符串反转这个简单的实例也可以轻而易举的用递归算法来实现啦!

实现反转所运用到的函数就是reverse()函数。而这里的递归对象就是字符串,结合阶乘,将字符串分成两个部分,首字符和其他字符。代码如下:

393ad17acfbe883f672e5c928312df90.png 点击运行后却发现报错了,这是为什么呢? 3c28dd9f52cb10646f5398bf853867c4.png

错误提示说:代码超过了最大递归深度1000层。这里的最大递归深度是程序为了防止递归无限错误而设计的。之前强调过基例的作用,而这里出现错误的原因就是因为没有基例。基例是最小的字符串概念,也就是“没有字符”,在这里不输入任何字符就可以了。

可以实现字符反转的代码如下:

f2466ab42da2cdbe62fff15ce261fc4a.png 6e2d4a05882fe843f6a0c85b64ec954f.png

4

总结

在递归算法中涉及到的知识点就是函数与代码复用的知识点。其实编程的目的就是减轻人类的负担,在程序设计的时候一定要多多思考,注意细节!

更多精彩文章:

答粉丝问|Python中模块导入方法的比较

如何下载付费音乐

从1到100求和学算法思维(六)

开发|关于微信小游戏开发的入门心得

JAVA|关于同步和异步的区别

Web|如何实现导航栏的默认,预览以及选中时的样式

 where2go 团队


微信号:算法与编程之美          

c45097e772346c5f2897d885ceb4c4d7.png

长按识别二维码关注我们!

温馨提示:点击页面右下角“写留言”发表评论,期待您的参与!期待您的转发!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值