zoukankan      html  css  js  c++  java
  • 递归初识

    递归的定义——*在一个函数里再调用这个函数本身*

    在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归

    **递归的最大深度——1000

    递归函数如果不受到外力的阻止会一直执行下去。但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,于是python为了杜绝此类现象,强制的将递归层数控制在了1000

    def foo(n):
        print(n)
        n += 1
        foo(n)
    foo(1)
    # RecursionError
    # 递归的最大深度1000层 : 为了节省内存空间,不要让用户无限使用内存空间
    # 1.递归要尽量控制次数,如果需要很多层递归才能解决问题,不适合用递归解决
    
    #修改递归最大深度
    import sys
    print(sys.setrecursionlimit(100000))
    

    1.递归要尽量控制次数,如果需要很多层递归才能解决问题,不适合用递归解决
    2.循环和递归的关系
    递归不是万能的
    递归比起循环来说更占用内存

    递归函数是怎么停下来的?递归3次结束整个函数
    count = 0
    def func():        # func1
        global count
        count += 1     # 1
        print(count)
        if count == 3: return
        func()
        print(456)
    func()
    
    def func():        # func2
        global count
        count += 1     # 2
        print(count)
        if count == 3: return
        func()
        print(456)
    
    
    def func():        # func3
        global count
        count += 1     # 3
        print(count)
        if count == 3:return
        func()
        print(456)
    
    函数的调用
    函数的参数
    函数的返回值
    
    一个递归函数要想结束,必须在函数内写一个return,并且return的条件必须是一个可达到的条件
    并不是函数中有return,return的结果就一定能够在调用函数的外层接收到
    def func(count):
        count += 1
        print(count)
        if count == 5 : return 5
        ret = func(count)
        print(count ,':',ret)
        return ret
    print('-->',func(1))
    
    def func(1):
        1 += 1
        print(2)
        if 2 == 5 : return 5
        ret = func(2)
        print(ret)
        return ret
    
    def func(2):
        2 += 1
        print(3)
        if 3 == 5 : return 5
        ret = func(3)
        print(ret)
        return ret
    
    def func(3):
        3 += 1
        print(4)
        if 4 == 5 : return 5
        ret = func(4)
        print(ret)
        return ret
    
    def func(4):
        4 += 1
        print(5)
        if 5 == 5 : return 5
        func(count)
    
    
    def func(count):
        count += 1
        print(count)
        if count == 5 : return 5
        return func(count)
    print('-->',func(1))
    

    计算阶乘 100! = 10099989796....*1

    # 递归相关
    # 1.计算阶乘 100! = 100*99*98*97*96....*1
        # 循环
        # 递归
    # def fin(n):
    #     if n ==1:
    #         return 1
    #     else:
    #         return n*fin(n-1)
    # ret = fin(10)
    # print(ret)
    
    # def fin(n):
    #     if n ==1 :
    #         return n
    #     else:
    #         return n*fin(n-1)
    # ret = fin(7)
    # print(ret)
    

    2.os模块:查看一个文件夹下的所有文件,这个文件夹下面还有文件夹,不能用walk

    # import os
    # path = 'e:py'
    # def show_file(path):
    #     name_lst = os.listdir(path)
    #     for name in name_lst:
    #         abs_path = os.path.join(path,name)
    #         if os.path.isfile(abs_path):
    #             print(name)
    #         elif os.path.isdir(abs_path):
    #             show_file(abs_path)
    # show_file(path)
    

    3.os模块:计算一个文件夹下所有文件的大小.这个文件夹下面还有文件夹,不能用walk

    # import os
    # path = 'e:py'
    # def file_size(path):
    #     size =0
    #     name_lst = os.listdir(path)
    #     for name in name_lst:
    #         abs_path = os.path.join(path,name)
    #         if os.path.isfile(abs_path):
    #             size += os.path.getsize(abs_path)
    #         else:
    #             ret = file_size(abs_path)
    #             size += ret
    #     return size
    #
    # print(file_size(path))
    

    4.计算斐波那契数列

     找第100个数
        1 1 2 3 5 8 13 21
    def bf(n):
        a = 1
        b = 1
        if n == 1 or n ==2:
            return 1
        else:
            return bf(n-1)+bf(n-2)
    print(bf(100))#算法太low
    
    #优化
    def fib(n,a=1,b=1):
        if n ==1 or n == 2:
            return b
        else:
            a,b = b , a+b
            return fib(n-1,a,b)
    print(fib(100))
    1 1 2 3 5 8 13 21
    
    用生成器
    def fib(n):
        a = 1
        yield a
        b = 1
        yield b
        while n>2:
            a,b = b , a+b
            yield b
            n -= 1
    import time
    for i in fib(10):
        time.sleep(0.5)
        print(i)
    

    5.三级菜单 可能是n级

    menu = {
        '北京': {
            '海淀': {
                '五道口': {
                    'soho': {},
                    '网易': {},
                    'google': {}
                },
                '中关村': {
                    '爱奇艺': {},
                    '汽车之家': {},
                    'youku': {},
                },
                '上地': {
                    '百度': {},
                },
            },
            '昌平': {
                '沙河': {
                    '老男孩': {},
                    '北航': {},
                },
                '天通苑': {},
                '回龙观': {},
            },
            '朝阳': {},
            '东城': {},
        },
        '上海': {
            '闵行': {
                "人民广场": {
                    '炸鸡店': {}
                }
            },
            '闸北': {
                '火车战': {
                    '携程': {}
                }
            },
            '浦东': {},
        },
        '山东': {},
    }
    
    # def menu_func(menu):
    #     flag = True
    #     while flag:
    #         for name in menu:
    #             print(name)
    #         key = input('>>>').strip()
    #         if menu.get(key):
    #             dic = menu[key]
    #             ret = menu_func(dic)
    #             flag = ret
    #         elif key.upper() =='B':
    #             return True
    #         elif key.upper()=='Q':
    #             return False
    
    #更优版
    def menu_func(menu):
        while True:
            for name in menu:
                print(name)
            key = input('>>>').strip()
            if menu.get(key):
                dic = menu[key]
                flag = menu_func(dic)
                if not flag :
                    return False
            elif key.upper() =='B':
                return True
            elif key.upper()=='Q':
                return False
    
    menu_func(menu)
    
  • 相关阅读:
    精彩分享
    Cocoa.Programming.for.Mac.OS.X 3rd 前8章小知识点
    ObjectiveC protocol 和 delegate
    Object copying
    KeyValue Observing
    实现KeyValue Coding 的5种方法
    关于 XIB 和 NIB
    ObjectiveC 中的 self 和 super
    使用KeyValue Coding
    PrepareStatement的两个executeQuery语句
  • 原文地址:https://www.cnblogs.com/wyh0717/p/13100547.html
Copyright © 2011-2022 走看看