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

     什么是递归函数:在一个函数内再调用这个函数本身,这样的函数就叫递归函数。


    山里有座庙,庙里有个老和尚,老和尚在讲故事讲什么呢?山里有座庙,庙里有个老和尚,老和尚在讲故事讲什么呢?山里有座庙,庙里有个老和尚,老和尚在讲故事讲什么呢?山里有座庙,庙里有个老和尚,老和尚在讲故事讲什么呢?山里有座庙,庙里有个老和尚,老和尚在讲故事讲什么呢?......................

    一直这样循环下去。怎样用递归函数来写这个故事呢?

    #在函数中调用这个函数本身,称这个函数为递归函数
    
    def story():
        s = "山里有座庙,庙里有个老和尚在讲故事,在讲什么呢?"
        print(s)
        story()
        
    story()
    View Code

    递归函数不是无限的循环下去的,最大循环层数是997层。可以根据需求修改,但是不建议修改,因为一直调用函数,名称空间会占用很多内存。

    n = 0
    import sys
    sys.setrecursionlimit(100000)#setrecursionlimit括号中的内容可以修改
    def f():
        global n#引用全局变量
        n+= 1
        print(n)
        f()
    f()
    #视个人电脑性能,得到的数字不一样

    递归函数  二分查找算法


    二分查找算法,主要针堆比较大的有序列表数据,取值

     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]

    从里面取出66

    以列表中间比大小。

    l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,65,66,67,69,72,76,82,83,88]
    def find(l,aim):
        mid = len(l)//2#取中间值
        if l[mid] > aim:#中间值和目标对比
            new_l = l[:mid]
            return  find(new_l,aim)
        elif l[mid] < aim:
            new_l = l[mid+1:]
            return find(new_l,aim)
        else:
            return l[mid]
    print(find(l,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]
    
    def func(l,aim,start = 0,end = len(l)-1):
        mid = (start + end )//2
        if not l[start:end+1]:
            return
        elif aim > l[mid]:
            return func(l,aim,mid+1,end)
        elif aim < l[mid]:
            return func(l,aim,start,mid-1)
        elif aim == l[mid]:
            return mid
    index = func(l,68)
    print(index)

    递归函数与三级菜单:

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

    用循环的笨办法写一遍

    while True:
        for key in menu:
            print(key)
        num_1 = input(">>>>:")
        if num_1 in menu.keys():
            while True:
                for i in menu[num_1]:
                    print(i)
                num_2 = input(">>>>>:")
                if num_2 in menu[num_1]:
                    for j in menu[num_1][num_2]:
                        print(j)
                    num_3 = input(">>>>:")
                    if num_3 in menu[num_1][num_2]:
                        for k in menu[num_1][num_2][num_3]:
                            print(k)
                    elif num_3 == "back":
                        break
                    else:
                        continue
    
                elif num_2 == "back":
                    break
                else:
                    continue
    
        elif num_1 == "back":
            break
        else:
            continue
    View Code

    再用递归写一遍这个菜单

    def threeLM(dic):
        while True:
            for k in dic : print(k)
            key = input(">>>:").strip()
            if key == "b" or key == "q":return key#输入b或者q结束程序,return终止程序
            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)
  • 相关阅读:
    myeclipse6.5设置智能提示
    web项目无法编译
    Duplicate property mapping of .....
    SSH常见面试题
    简易计算器JS方式实现
    js中两个感叹号的作用
    Pro Javascript Design Patterns勘误Errata汇总(持续更新中)
    Javascript简写条件语句
    js中值得推荐的Memoization
    使用au3脚本编写自动登录126邮箱
  • 原文地址:https://www.cnblogs.com/shengzhongqiu/p/7265164.html
Copyright © 2011-2022 走看看