递归初识

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

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

**递归的最大深度——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)
posted @ 2020-06-12 17:01  爱浪的跳蚤  阅读(197)  评论(0编辑  收藏  举报