zoukankan      html  css  js  c++  java
  • 递归、堆栈练习

    练习题

    1. 发红包

    sort

    sort() 与 sorted() 区别:

    sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
    
    list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
    

    示例:

    >>> students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
    >>> sorted(students, key=lambda s: s[2])            # 按年龄排序
    [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
     
    >>> sorted(students, key=lambda s: s[2], reverse=True)       # 按降序
    [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
    

    lambda 只返回5:

    a = lambda :5
    print(a())
    print(a) 是函数的内存地址
    
    相当于:
    	def func():
    		return 5
    	函数没有形参。
    

    sum()

    >>>sum([0,1,2])  
    3  
    >>> sum((2, 3, 4), 1)        # 元组计算总和后再加 1
    10
    >>> sum([0,1,2,3,4], 2)      # 列表计算总和后再加 2
    12
    

    发红包(生成器版本):

    import random
    
    def red_packet(money,num):
        ret = random.sample(range(1,money*100),num)
        ret.extend([0,money*100])
        ret.sort()
        for i in range(num):
            yield (ret[i+1] - ret[i])/100
    
    for i in red_packet(200,10):
        print(i)
    
    # print(red_packet(100,10).__next__())
    # print(red_packet(100,10).__next__())
    

    2. 计算文件夹大小---递归

    到底在什么时候停止,返回值

    每一层往下递,执行完成之后返回给调用他的地方,即归。

    递归实现:

    import os
    def file_size(path):
        ret = os.listdir(path)
        total = 0
        for name in ret:
            abs_path = os.path.join(path,name)
            if os.path.isdir(abs_path):
                total += file_size(abs_path)
            elif os.path.isfile(abs_path):
                total += os.path.getsize(abs_path)
        return total
    ret = file_size(r'C:UsersAdministratorPycharmProjectsoldboyday09')
    print(ret)
    

    堆栈实现:

    栈是一种计算机存储数据的思想,先进后出

    import os
    path = r'C:UsersAdministratorPycharmProjectsoldboyday09'
    li = [path]
    total = 0
    while li:
        path = li.pop()
        for i in os.listdir(path):
            abs_path = os.path.join(path,i)
            if os.path.isdir(abs_path):
                li.append(abs_path)
            else:
                total += os.path.getsize(abs_path)
    print(total)
    

    3. 三级菜单

    menu = {
        '北京': {
            '海淀': {
                '五道口': {
                    'soho': {},
                    '网易': {},
                    'google': {}
                },
                '中关村': {
                    '爱奇艺': {},
                    '汽车之家': {},
                    'youku': {},
                },
                '上地': {
                    '百度': {},
                },
            },
            '昌平': {
                '沙河': {
                    '老男孩': {},
                    '北航': {},
                },
                '天通苑': {},
                '回龙观': {},
            },
            '朝阳': {},
            '东城': {},
        },
        '上海': {
            '闵行': {
                "人民广场": {
                    '炸鸡店': {}
                }
            },
            '闸北': {
                '火车战': {
                    '携程': {}
                }
            },
            '浦东': {},
        },
        '山东': {},
    }
    

    递归实现

    def func(dic):
        while True:
            for i in dic.keys():
                print(i)
            choose = input(">>>")
            if choose in dic.keys():
                ret = func(dic[choose])
                if ret == 'q': return 'q'
            elif choose == 'b':
                return 'b'
            elif choose == 'q':
                return 'q'
    
    func(menu)
    print('函数执行完成!~!')
    

    堆栈实现

    l = [menu]
    while l:
        for key in l[-1]:print(key)
        k = input('input>>').strip()   # 北京
        if k in l[-1].keys() and l[-1][k]:l.append(l[-1][k])
        elif k == 'b':l.pop()
        elif k == 'q':break
    My name is 侯冰雷 ~~欢迎转载 ~~欢迎关注 ~~欢迎留言
  • 相关阅读:
    8月10日
    8月9日
    8月8日
    8月7日
    8月6日
    8月5日
    《大道至简》读后感
    8月4日
    8月3日
    8月2日
  • 原文地址:https://www.cnblogs.com/houbinglei/p/9332254.html
Copyright © 2011-2022 走看看