十四. Python基础(14)--递归

1 ● 递归(recursion)

概念: recursive functions—functions that call themselves either directly or indirectly in order to loop.

最大递归层数: the default maximum recursion depth in Python is 997.

限制条件: 一定有一个分支不调用自身

修改最大递归层数:

import sys

sys.setrecursionlimit(1500)

COUNT = 0

 

def func():

    global COUNT # 虽然函数内可以引用COUNT, 但是因为下面修改了COUNT, 所以要用global声明COUNT

    COUNT += 1

    print(COUNT)

    func()

 

func()

 

2 ● 递归的典型案例:

alex的年龄

阶乘

斐波那契数列

二分查找

三级菜单

 

3 ● alex的年龄

def age(n):

    if n == 4:

        return 40

    return age(n+1) + 2

 

print(age(4)) # 40

 

4 ● 阶乘

def fact(n):

    if n == 1:

        return 1

    return n * fact(n-1)

 

print(fact(4)) # 24

 

5 ● 斐波那契数列

def fib(n):

    if n ==1 or n == 2:

        return 1

    return fib(n-1) + fib(n-2)

 

print(fib(6)) # 8

 

6 ● 二分查找

def search(num, l, start = None, end =None):

    start = start if start else 0

    end = end if end else len(l)-1

    mid = (end-start)//2 + start

    if start > end:

        return None

    elif l[mid] > num:

        return search(num, l, start, mid - 1)

    elif l[mid] < num:

        return search(num, l, mid + 1, end)

    elif l[mid] == num:

        return mid

 

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

print(search(66,l)) # 17

 

7 ● 三级菜单

menu = {

    '北京': {

        '海淀': {

            '五道口': {

                'soho': {},

                '网易': {},

                'google': {}

            },

            '中关村': {

                '爱奇艺': {},

                '汽车之家': {},

                'youku': {},

            },

            '上地': {

                '百度': {},

            },

        },

        '昌平': {

            '沙河': {

                '老男孩': {},

                '北航': {},

            },

            '天通苑': {},

            '回龙观': {},

        },

        '朝阳': {},

        '东城': {},

    },

    '上海': {

        '闵行': {

            "人民广场": {

                '炸鸡店': {}

            }

        },

        '闸北': {

            '火车战': {

                '携程': {}

            }

        },

        '浦东': {},

    },

    '山东': {},

}

def Three_Level_Menu(menu):

    while True:

        for k in menu:print(k)

        key = input('>>>')

        if key == 'q':return 'q'

        elif key == 'b': # 退出本轮循环(递归函数造就了一个循环体)break

        elif key in menu:

            ret = Three_Level_Menu(menu[key])

            if ret == 'q':

                return 'q' # ① 回归到最后一层时, 没有key == 'q'为True的情况, 所以会return一个'q'(没有设置接受的变量), 然后结束整个函数; ② 如果ret !='q', 并且key不在当前字典的键里面, 那么重新开始本轮循环(递归函数造就了一个循环体)

Three_Level_Menu(menu)

另一方法:

pres_dic = menu # 当前词典

prev_dic = [] # 用来存储之前已经查询的词典

 

print("下面是可供查询的地点:")

while True:

    for key in pres_dic.keys():

        print(key)

    inp = input("请输入您要查询的地点, 输入b/B退回上一层, 输入q/Q退出查询:").strip()

    if inp not in pres_dic.keys() and inp.lower() != 'b' and inp.lower() != 'q':

        print("您输入的地点不存在, 请重新输入!")

        continue

 

    if inp in pres_dic.keys():

        prev_dic.append(pres_dic)

        pres_dic = pres_dic[inp] # 然后开始新一轮的循环

 

    if inp.lower() == 'b':

        if prev_dic != []: # 等价于if prev_dic:

            pres_dic = prev_dic[-1] # 当前词典编程
之前已经查询的词典列表
的最后一个

            del prev_dic[-1] # # 用来存储之前已经查询的词典列表去掉最后一个元素

        else:

            print("没有更大级别的地点了!")

 

    if inp.lower() == 'q':

        break

 

8 ● 面试真题

# 提取各个fields对应的数据

data={"time":"2016-08-05T13:13:05",

    "some_id":"ID1234",

    "grp1":{ "fld1":1,"fld2":2},

    "xxx2":{ "fld3":0,"fld5":0.4},

    "fld6":11,

    "fld7":{"fld100": 0, "fld500": 0.4},

    "fld46":8}

#fields:由"|"连接的以"fld"开头的字符串,如:fld2|fld3|fld7|fld19

# 解法1:

def select(data,fields):

    result = {}

    field_lst = fields.split('|')

    for key in data:

        if key in field_lst:

            result[key] = data[key]

        if type(data[key]) == dict:    # 不要写成elif, 否则, "fld100"对应的数据无法提取出来

            res = select(data[key],fields)

            result.update(res)

    return result

# 解法2:

def select(data,fields,result = {}):

    field_lst = fields.split('|')

    for key in data:

        if key in field_lst:

            result[key] = data[key]

        if type(data[key]) == dict: # 不要写成elif, 否则, "fld100"对应的数据无法提取出来

            select(data[key], fields)

    return result

 

fields = 'fld2|fld3|fld7|fld19|fld100'

ret = select(data,fields)

print(ret) # {'fld2': 2, 'fld3': 0, 'fld7': {'fld100': 0, 'fld500': 0.4}, 'fld100': 0}

 

 

十四. Python基础(14)--递归的更多相关文章

  1. 二十四. Python基础(24)--封装

    二十四. Python基础(24)--封装 ● 知识结构   ● 类属性和__slots__属性 class Student(object):     grade = 3 # 也可以写在__slots ...

  2. 十八. Python基础(18)常用模块

    十八. Python基础(18)常用模块 1 ● 常用模块及其用途 collections模块: 一些扩展的数据类型→Counter, deque, defaultdict, namedtuple, ...

  3. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

  4. 十六. Python基础(16)--内置函数-2

    十六. Python基础(16)--内置函数-2 1 ● 内置函数format() Convert a value to a "formatted" representation. ...

  5. 四. Python基础(4)--语法

    四. Python基础(4)--语法 1 ● 比较几种实现循环的代码 i = 1 sum = 0 while i <= 10: # 循环10-1+1=10次     sum += i     i ...

  6. 「kuangbin带你飞」专题十四 数论基础

    layout: post title: 「kuangbin带你飞」专题十四 数论基础 author: "luowentaoaa" catalog: true tags: mathj ...

  7. 二十五. Python基础(25)--模块和包

    二十五. Python基础(25)--模块和包 ● 知识框架   ● 模块的属性__name__ # my_module.py   def fun1():     print("Hello& ...

  8. 二十二. Python基础(22)--继承

    二十二. Python基础(22)--继承 ● 知识框架   ● 继承关系中self的指向 当一个对象调用一个方法时,这个方法的self形参会指向这个对象 class A:     def get(s ...

  9. 十九. Python基础(19)--异常

    十九. Python基础(19)--异常 1 ● 捕获异常 if VS异常处理: if是预防异常出现, 异常处理是处理异常出现 异常处理一般格式: try:     <............. ...

随机推荐

  1. selenium+Page Objects(第二话)

    前面介绍了什么是po模式,并且简单分析了一下使用po模式编写脚本的思路,接下来开始正式编写 1.先编写一个页面基类BasePage.py,里面封装每个页面常用的一些方法 # coding: utf-8 ...

  2. java---->lombok.jar的使用

    lombok.jar是在看一个项目的代码时遇见的一个“新包”,记录下用法: 1.新建maven工程myfirst,新建一个javabean User,写一个LombokTest类,在pom.xml引入 ...

  3. 纯CSS方块转化梯形动画

    http://jasonning92.github.io/JasonsBlog/pages/%E7%BA%AFCSS%E6%96%B9%E5%9D%97%E8%BD%AC%E5%8C%96%E6%A2 ...

  4. codeforces 848B Rooter's Song 思维题

    http://codeforces.com/problemset/problem/848/B 给定一个二维坐标系,点从横轴或纵轴垂直于发射的坐标轴射入(0,0)-(w,h)的矩形空间.给出点发射的坐标 ...

  5. Binomial Coefficient(二项式系数)

    In mathematics, any of the positive integers that occurs as a coefficient in the binomial theorem is ...

  6. PHP单例模式 demo

    <?php class single{ static public $db; private function __construct(){ }; static function getinst ...

  7. CF1107E Vasya and Binary String

    比赛的时候又被垃圾题艹翻了啊. 这个题显然是区间dp 考虑怎么转移. 类似消除方块和ZYB玩字符串那样的一个DP. 可以从左到右依次考虑消除. dp[l][r][k][flag]表示区间l,r左边粘着 ...

  8. Fox And Dinner CodeForces - 510E (最大流)

    大意: n只狐狸, 要求分成若干个环, 每个环的狐狸不少于三只, 相邻狐狸年龄和为素数. 狐狸年龄都>=2, 那么素数一定为奇数, 相邻必须是一奇一偶, 也就是一个二分图, 源点向奇数点连容量为 ...

  9. List<String> 和 ArrayList<String>的区别(转载)

    最近对这两个问题比较懵逼,关于List和ArrayList.List<String> list = new ArrayList<String>(); 好了,先搞明白List 和 ...

  10. 『MXNet』第七弹_多GPU并行程序设计

    资料原文 一.概述思路 假设一台机器上有个GPU.给定需要训练的模型,每个GPU将分别独立维护一份完整的模型参数. 在模型训练的任意一次迭代中,给定一个小批量,我们将该批量中的样本划分成份并分给每个G ...