递归、堆栈练习

练习题

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:\Users\Administrator\PycharmProjects\oldboy\day09')
print(ret)

堆栈实现:

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

import os
path = r'C:\Users\Administrator\PycharmProjects\oldboy\day09'
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
posted @ 2018-07-18 19:50  binglei  阅读(233)  评论(0编辑  收藏  举报