从0开始学习python5:递归学习之阶乘及总结

最近在写制作科赫雪花的例程时,需要用到递归的思想。然而自己看了很久,依旧看不出什么头绪。于是上网搜索了很多资料阅读,稍微理解了递归的思想了,但是感觉依旧生涩难懂,特别是需要自己写递归的代码的时候,更是没有头绪了。为了加深自己对递归的理解,就着手自己写一个阶乘的程序。遇到了很多问题。在这里总结一下。
什么是递归?
知乎有个回答,让人印象深刻(改版):

天下有奇族人姓计,长生不老。一日其孙问其父:吾之18代祖名何?
其父不明,父问其父
其父不明,父问其父
其父不明,父问其父
其父不明,父问其父

晌后,其18代祖回其子:妮泰美
然其回其子:计妮泰美
然其回其子:计妮泰美
然其回其子:计妮泰美
然其回其子:计妮泰美
……
终,计姓末代孙知其18代祖名“计妮泰美”

此奶,递归。

虽是抖机灵的段子,但其深刻写出了递归递进与归来的思想。一层一层递进,直到最后一个知道的人(基例)得到答案,然后再一层一层传出来(经过规律处理),这就是递归。

在慕课网的回答中,他总结递归首先要弄清楚两点:

递归的出口(终止递归的条件,即基例)
递归的表达式(规律)

这个思想对编写出递归的程序很重要。

下面是刚刚写阶乘递归时的错误代码:

错误示例1:

#jiecheng
#f (n)= n! 
def f(n):
    if n==1:
        f(n) = 1
    else:
        f(n) = n*f(n-1)
def main():
    print(f(5))
main()

运行结果:
在这里插入图片描述
错误总结:语法错误。函数理解的错误,误认为代码的编写与数学中写公式一样。

错误示例2:

#jiecheng
#f = n! 
def f(z,n):
    if n==1:
        z = 1
    else:
        z = n*f(z,n-1)
def main():
    z = 0
    f(z,5)
    print(z)
main()

输出为:

Traceback (most recent call last):
File “D:/python/jiecheng.py”, line 12, in
main()
File “D:/python/jiecheng.py”, line 10, in main
f(z,5)
File “D:/python/jiecheng.py”, line 7, in f
z = nf(z,n-1)
File “D:/python/jiecheng.py”, line 7, in f
z = n
f(z,n-1)
File “D:/python/jiecheng.py”, line 7, in f
z = n*f(z,n-1)
[Previous line repeated 2 more times]
TypeError: unsupported operand type(s) for *: ‘int’ and ‘NoneType’

错误总结:
z = n*f(n-1)不能这样相乘,不然会出错,好像是NoneType类型中的一种坑,原因暂时未知。

正确示例:

#jiecheng
# f(n)= n!
def f(n):
    if n==1:
        return 1
    else:
        return n*f(n-1)
def main():
    print(f(5))
main()

输出为:120

总结:
函数的相乘与等式与数学中的计算公式既有相同也有区别,注意其中的区别,程序中的函数不可以直接像数学中f(n) = 1 这样出现的,若要输出n,应该是用 return n
(return n 等效于数学中的f(n) = 1。)

全文总结:
1、递归首先需要弄清的两个问题:一是递归的基例,而是递归的表达式。

2、自己的语法还是有很多问题,有待加强,需要多自己实战写代码才能发现自己的各种问题。

3、多记录总结

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值