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