zoukankan      html  css  js  c++  java
  • python--递归、二分查找算法

                                    递归

    初识递归

    递归的定义——在一个函数里再调用这个函数本身

    现在我们已经大概知道刚刚讲的story函数做了什么,就是在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归

    刚刚我们就已经写了一个最简单的递归函数。

    递归的最大深度——997

    正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去。但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,于是python为了杜绝此类现象,强制的将递归层数控制在了997(只要997!你买不了吃亏,买不了上当...).

     递归函数与三级菜单

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

    1 def threeLM(dic):

    2 while True:

    3 for k in dic:print(k)

    4 key = input('input>>').strip()

    5 if key == 'b' or key == 'q':return key

    6 elif key in dic.keys() and dic[key]:

    7 ret = threeLM(dic[key])

    8 if ret == 'q': return 'q'

    9 elif (not dic.get(key)) or (not dic[key]) :

    10 continue

    11

    12 threeLM(menu)

     二分法

    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]

    你观察这个列表,这是不是一个从小到大排序的有序列表呀?

    如果这样,假如我要找的数比列表中间的数还大,是不是我直接在列表的后半边找就行了?

    这就是二分查找算法

    贴上两段代码:

    一:简单二分法

    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):

    mid = (len(l)-1)//2

    if l:

      if aim > l[mid]:

        func(l[mid+1:],aim)

      elif aim < l[mid]:

        func(l[:mid],aim)

      elif aim == l[mid]:

        print("bingo",mid)

      else: print('找不到')

    func(l,66)

    func(l,6)

    二:

      升级版二分法

    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]:

        print("bingo")

      return mid

    index = func(l,68)

    print(index)

          

    #递归解决的问题
    #就是通过参数,来控制每一次缩小计算的规模
    #适合的场景:数据的规模在减小 解决问题的思路在改变
    #总结:结束递归的标志:return
    #用处:未来遇到很多递归的地方,算法(排序算法,金融类) 9
    #递归函数:在一个函数里调用自己
    #最大递归层数做了一个限制:997
    #最大层数限制是python默认的。可以做修改
    #但是不建议修改
    #import sys #所以和python相关的设置和放到
    # def a():
    # print("ff")
    # a()
    # a()
    #
    # import sys
    # sys.setrecursionlimit(10000000)
    # n =1
    # def a():
    # global n
    # n += 1
    # # print("ff")
    # print(n)
    # a()
    # a()

    # def age(n):
    # if n == 1:
    # return 40
    # else:
    # ret = age(n-1)
    # return ret + 2
    # print(age(5))
    # def age(5):
    # if 5 == 1:
    # return 40
    # else:
    # ret = 46
    # return ret + 2
    #
    # def age(4):
    # if 5 == 1:
    # return 40
    # else:
    # ret = 44
    # return ret + 2
    #
    # def age(3):
    # if 5 == 1:
    # return 40
    # else:
    # ret = 42
    # return 44
    #
    # def age(2):
    # if 5 == 1:
    # return 40
    # else:
    # ret = 40
    # return 42
    #
    # def age(1):
    # if 5 == 1:
    # return 40

    #age(1) == 40
    #
    # l = [1,2,3,4,5,6,7,8,9,10,11,12,23,45,67,89,100]
    # def find(l,aim):
    # mid = len(l)//2
    # if l[mid] > aim:
    # ll=l[:mid]
    # return find(ll,aim)
    # elif l[mid] < aim:
    # ll= l[mid+1:]
    # return find(ll,aim)
    # else:
    # return l.index(aim)
    # print(find(l,11))
    #
    # def a(num):
    # if num %2.2 == 0:
    # num = num // 2
    # return a(num)
    # else:
    # return num
    # print(a(8.8))
    menu = {
    '北京': {
    '海淀': {
    '五道口': {
    'soho': {},
    '网易': {},
    'google': {}
    },
    '中关村': {
    '爱奇艺': {},
    '汽车之家': {},
    'youku': {},
    },
    '上地': {
    '百度': {},
    },
    },
    '昌平': {
    '沙河': {
    '老男孩': {},
    '北航': {},
    },
    '天通苑': {},
    '回龙观': {},
    },
    '朝阳': {},
    '东城': {},
    },
    '上海': { '闵行': { "人民广场": { '炸鸡店': {} } }, '闸北': { '火车战': { '携程': {} } }, '浦东': {}, }, '山东': {},}# def ak(men):# while True:# for key in men:# print(key)# k = input("input>>>")# return ak(men[k])# print(ak(menu))# def ak(men):# # print("大区信息")# while True:# for key in men:# print(key)# k = input("input(quit或者exit退出)>>>")# if k =="quit" or k == "exit":# return k# else:# return ak(men[k])# print(ak(menu))#
  • 相关阅读:
    前端带队之漫谈
    css3之currentColor
    安装及升级node
    谈JavaScript代码封装
    再玩儿一次——深入理解闭包
    【学习笔记】ES6标准入门
    【学习笔记】移动Web手册(PPK力作)
    使用webstorm操作git
    使用webstorm调试node程序
    前端代理nproxy
  • 原文地址:https://www.cnblogs.com/DE_LIU/p/7264959.html
Copyright © 2011-2022 走看看