递归的概念

我调用我自己,容易遇到递归最大深度的问题

修改递归深度的代码

  1. import sys
  2. sys.setrecursionlimit(1024)

示例代码

  1. def tell_story():
  2. print("从前山上有座庙")
  3. print("庙里有个小和尚")
  4. print("庙里还有一个老和尚")
  5. print("老和尚在给小和尚讲故事")
  6. print("老和尚讲的故事是……")
  7. tell_story()
  8. tell_story()

image.png

递归最重要的是出口条件

利用条件语句if来控制递归次数

注意函数内部使用外部变量,必须先声明全局变量

  1. count = 0
  2. def tell_story():
  3. global count
  4. count += 1
  5. print("从前山上有座庙")
  6. print("庙里有个小和尚")
  7. print("庙里还有一个老和尚")
  8. print("老和尚在给小和尚讲故事")
  9. print("老和尚讲的故事是……")
  10. if count < 5:
  11. print("这是第{}次".format(count))
  12. tell_story()
  13. tell_story()

image.png

递归的例子

计算前n项和, 通过观察可以发现,每两个数字相加,都是在前一个数字的基础上加一,所以将n项之和转化为两项之和;

由于计算有极限,但是我们不知道最后一项的值,但是我们知道第一项的值,所以从后往前运算,可以得出结果,运算的起止条件就设为n等于0;

  1. import sys
  2. sys.setrecursionlimit(2048)
  3. count = 0
  4. def tell_story():
  5. global count
  6. count += 1
  7. print("从前山上有座庙")
  8. print("庙里有个小和尚")
  9. print("庙里还有一个老和尚")
  10. print("老和尚在给小和尚讲故事")
  11. print("老和尚讲的故事是……")
  12. if count < 5:
  13. print("这是第{}次".format(count))
  14. tell_story()
  15. tell_story()
  16. def get_sum(n):
  17. if n == 0:
  18. return 0
  19. return n + get_sum(n - 1)
  20. print(get_sum(10))

image.png

补充 —- 斐波那契数列

image.png

斐波那契数列和求前n项和有一个共同特点,就是最前面的元素,比如在前n项和中,第一项为零,在斐波那契数列中,第一项和第二项的值都为1,可以把这种运算看作是因式分解,最后将一个很大的数字转换为多个基数求和;