函数递归调用

递归

  • 递归就是在函数运行期间直接或者间接的调用了函数自身 ,这就形成了函数的递归

    • 递归的缺点:

      • 相比于循环执行效率较慢

      • 真用内存资源较大

      • python语言不自带尾递归优化

    • 递归的表现形式

      >>> def func():
      ...     print('Im func')
      ...     func()  # 在函数内部调用了自身
      ...
      >>> func()
      Im func
      Im func
      Im func
      Im func
      ...... (无数次Im func)
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
        File "<stdin>", line 3, in func
        File "<stdin>", line 3, in func
        File "<stdin>", line 3, in func
        [Previous line repeated 992 more times]
        File "<stdin>", line 2, in func
      RecursionError: maximum recursion depth exceeded while calling a Python object
          
      # 为什么会出现报错呢?
      分析一下func的执行过程
          第一次执行func 打印 Im func,并且调用func
          函数执行结束了吗?没有
          会反复的一直调用func,形成死循环,超出了python的递归深度

       

    • 递归深度

      • 顾名思义,就是递归的最深层数,超出了设定的深度就会报错

      >>> import sys
      >>> sys.getrecursionlimit() # 查看递归深度
      1000
      >>> sys.setrecursionlimit(2000) # 修改递归深度
      >>> sys.getrecursionlimit()
      2000

      # 其实修改递归深度是没什么意义的,白白的浪费资源,因为就算修改成了1亿层,还是有内存限制的
    • 递归终止条件

      • 递归一定要有终止条件,当符合否中条件的时候结束递归,否则就会像上面func函数一样形成死循环而报错

      # 来做一个小练习就明白了
      >>> L = [1,2,[3,4],5,6,[7,8,9]] # 求出所有元素加一起的和
      >>> sum1 = 0
      >>> def my_sum(l):
      ...     for my_var in l:    # 当列表里不存在值得时候结束,这就是终止条件
      ...         global sum1
      ...         if isinstance(my_var,list):
      ...             my_sum(my_var)
      ...         else:
      ...             sum1 += my_var
      ...     
      >>> my_sum(L)
      >>> print(sum1)
      ​
      # 阶乘
      >>> def func(num):
      ...     if num == 1:    # 终止条件,等于1时结束
      ...         return 1
      ...     return func(num-1) * num
      ...
      >>> func(5)
      120
    • 练习1
      • #!/usr/bin/evn python
        # -*- coding: utf-8 -*-
        
        '''
            需求:
                发工资1w元,每天花5/1+50元
                问: 能花多少天?
        '''
        
        # salary = input('您发了多少工资?: ').srtip()
        salary = 10000
        
        # 花钱
        def spend(salary,day=0):
            spend_monry = (salary / 5 + 50)
            remnant_money = salary - spend_monry
            if remnant_money < 0:
                return day
            day += 1
            print('今天是%d天\n还剩下%d元' % (day,remnant_money))
            return spend(remnant_money,day)
        spend_monry_day = spend(salary)
        print(spend_monry_day)
        花钱计算
    • 练习2
      • #!/usr/bin/env python
        # -*- coding: utf-8 -*-
        
        '''
            需求:
                利用递归删除非空目录
        '''
        
        import os
        def rm_dir(my_dir):
            # 遍历目录下文件
            for file_name in os.listdir(my_dir):
                # 拼接路径和文件
                abs_path = os.path.join(my_dir,file_name)
                # 如果是文件则删除
                if os.path.isfile(abs_path):
                    os.remove(os.path.join(my_dir,abs_path))
                # 如果不是文件
                else:
                    # 文件夹为空则递归函数
                    if os.listdir(abs_path):
                        rm_dir(abs_path)
                    # 删除目录
                    os.rmdir(os.path.join(my_dir,abs_path))
            # 目录为空则删除
            if not os.listdir(my_dir):
                os.rmdir(my_dir)
        
        while True:
            inp = input('请输入要删除的目录的绝对路径: ').strip()
            if not inp or not os.path.isdir(inp):
                print('请输入正确的目录')
                continue
            rm_dir(inp)
        删除空目录

         

posted @ 2018-11-13 22:27  浩小白  Views(157)  Comments(0Edit  收藏  举报