递归函数

递归函数简介

 之前讲到函数的定义可以嵌套,函数装饰器也可以嵌套,函数的调用也可以嵌套。在函数调用的嵌套里,调用函数的内部,又直接或者间接地调用了函数自身,这就称为函数的递归调用,又称为递归函数。

形式一:直接调用函数自身

  # 示例
      def index(count):
          print(count)
          count +=1
          index(count)


      index(0)  # 结果为997之后报错'maximum recursion depth exceeded while calling a Python object'

形式二:间接调用自身(两函数互相调用)

        # 示例
      def index():  # 函数一
          global count
          count += 1
          print(count)
          print('hahaha')
          func()  # 调用函数二


      def func():  # 函数二
          print('xixixi')
          global count
          count += 1
          print(count)
          index()  # 调用函数一


      func()  # 运行到第999次报错

以上两种方式的执行结果报错是因为函数的最大递归深度超出限制(默认最大限制是1000,不过不同的计算机可能稍微有一些偏差),然后Python解释器的应急机制启动,阻止函数继续运行。需要注意的是并不是所有的编程语言都有像Python一样的应急机制。

最大递归深度相关的操作

      import sys  # 加载模块
      print(sys.getrecursionlimit())  # getrecursionlimit关键字获取系统的默认最大递归深度
      '''
      为了不让代码因为超出最大递归深度而报错,从而终止程序,可以用setrecursionlimit关键字修改最大递归深度的限制,避免报错。
      '''
      sys.setrecursionlimit(1200)  


      def index(count):
          print(count)
          count += 1
          index(count)


      index(0)

递归函数的原则

  • 函数每一次递归都必须向解决问题的答案靠拢(问题复杂度降低)
  • 函数递归要有明确的结束条件限制

问题练习:

 问题一:求59049是3的多少次方?

      def get_num(n, count):  # 传两个参数,第一个是n的值,第二个是记除以3的次数
          if n == 1:
              return count  # 当n等于1的时候返回count的数值
          return get_num(n/3, count + 1)  # n不等于1的时候递归,参数n除以三,参数count加一


      print(get_num(59049, 0))

 问题二:循环打印列表内的数字

      name_list = ['olive', ['jason', ['kevin', ['justin', ['ber', ['sil', ['cam']]]]]]]


      def num(list_name):
          for i in list_name:
              if isinstance(i, str):  # 判断某个元素是否是某种类型
                  print(i)
              else:
                  num(i)


      num(name_list)

递归函数结束

posted @ 2022-03-21 16:37  Oliver-Chance  阅读(339)  评论(0)    收藏  举报