zoukankan      html  css  js  c++  java
  • python 函数的递归

    递归:简单来说就是自己调用自己

    这里我们又要举个例子来说明递归能做的事情。

    例一:

    现在你们问我,alex老师多大了?我说我不告诉你,但alex比 egon 大两岁。

    你想知道alex多大,你是不是还得去问egon?egon说,我也不告诉你,但我比武sir大两岁。

    你又问武sir,武sir也不告诉你,他说他比金鑫大两岁。

    那你问金鑫,金鑫告诉你,他40了。。。

    这个时候你是不是就知道了?alex多大?

    1 金鑫   40
    2 武sir   42
    3 egon   44
    4 alex    46

    你为什么能知道的?

    首先,你是不是问alex的年龄,结果又找到egon、武sir、金鑫,你挨个儿问过去,一直到拿到一个确切的答案,然后顺着这条线再找回来,才得到最终alex的年龄。这个过程已经非常接近递归的思想。我们就来具体的我分析一下,这几个人之间的规律。

    age(5) = age(4) + 2
    age(4) = age(3) + 2 age(3) = age(2) + 2 age(2) = age(1) + 2 age(1) = 40

    那这样的情况下,我们的函数应该怎么写呢?

    复制代码
    __author__ = 'Administrator'
    def f(n):
       if n==1:
           return 40
       else:
           ret=f(n-1)+2
           return ret
    
    print(f(5))
    
    '''
    n=5 return f(4)+2=f(3)+4=f(2)+6=f(1)+8
    '''
    复制代码

    递归实现二分算法

    如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做?

    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]

    1.简单版本
    复制代码
    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]
    
    def f(l,aim):
        mid=len(l)//2
        if l[mid]>aim:
            return f(l[0:mid],aim)
        elif  l[mid]<aim:
            return f(l[mid+1:],aim)
        else:
            return l[mid]
    
    print(f(l,66))
    复制代码

    2.升级版本,找到位置

    复制代码
    __author__ = 'Administrator'
    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]
    
    def f(l,aim,start,end):
        mid=(start+end)//2
    
        if l[mid]>aim:
            return f(l,aim,start,mid-1)
        elif l[mid]<aim:
            return f(l,aim,mid+1,end)
        elif l[mid]==aim:
            return mid
        else:
            print("找不到")
    
    print(f(l,66,0,len(l)-1))
    复制代码

    递归函数与三级菜单

    复制代码
    menu = {
        '北京': {
            '海淀': {
                '五道口': {
                    'soho': {},
                    '网易': {},
                    'google': {}
                },
                '中关村': {
                    '爱奇艺': {},
                    '汽车之家': {},
                    'youku': {},
                },
                '上地': {
                    '百度': {},
                },
            },
            '昌平': {
                '沙河': {
                    '老男孩': {},
                    '北航': {},
                },
                '天通苑': {},
                '回龙观': {},
            },
            '朝阳': {},
            '东城': {},
        },
        '云南': {
            '昆明': {
                "官渡区": {
                    '阿拉村':{},
                    '大板桥':{},
                    '官渡广场':{},
                    '关上':{}
                },
                "五华区":{},
                '呈贡':{}
            },
            '曲靖': {
                '宣威': {
                    '美幻广场': {},
                    '宛水公园': {},
                    '东山': {}
                },
                 '麒麟区': {
                    '麒麟公园': {},
                    '珠江源广场': {},
                    '南城门广场': {}
                },
                 '沾益区': {
                    '玉林山水': {},
                    '小花园': {},
                },
            },
            '玉溪': {
                 '红塔区': {
                    '红塔集团': {},
                    '聂耳广场': {}
                },
                 '澄江县': {
                    '抚仙湖': {},
                    '黄金海岸': {},
                },
                 '通海县': {
                    '铜锅饭': {},
                    '石锅鱼': {},
                    }
            },
        },
        '山东': {},
    }
    复制代码
    复制代码
    def threeLM(dic):
        while True:
            for k in dic:print(k)
            key = input('input>>').strip()
            if key == 'b' or key == 'q':return key
            elif key in dic.keys() and dic[key]:
                ret = threeLM(dic[key])
                if ret == 'q': return 'q'
            elif (not dic.get(key)) or (not dic[key]) :
                continue
    
    threeLM(menu)
    复制代码
    复制代码
    def fun(s):
        while True:
            for k in s:
                print(k)
            dd=input("input>>:").strip()
            if dd in s:
               fun(s[dd])
            elif dd=="back":
                break
    fun(menu)
    复制代码
  • 相关阅读:
    [Java] JDBC 06 批Transaction处理 -- conn.setAutoCommit(false); // 不让其自动提交 (很重要的知识点)
    [Java] JDBC 05 TestBatch.java 批处理 Batch
    [Java] JDBC 04 TestProc.java (对存储过程进行调用 CallableStatement)
    [Java] JDBC 03 TestPrepStmt.java
    美化复选框
    美化单选框
    canvas
    html5新增标签
    旋转、水平翻转、垂直翻转
    dede让channelartlist标签支持currentstyle属性 完美解决
  • 原文地址:https://www.cnblogs.com/Xanderzyl/p/10496341.html
Copyright © 2011-2022 走看看