Python递归函数,二分查找算法简介-Python教程

资源魔 35 0

1、初始递归

  递归函数:正在一个函数里正在挪用这个函数自身。

  递归的最年夜深度:998

  正如你们刚刚看到的,递归函数假如没有遭到外力的阻止会不断执行上来。然而咱们以前曾经说过对于函数挪用的成绩,每一一次函数挪用城市孕育发生一个属于它本人的称号空间,假如不断挪用上来,就会造成称号空间占用太多内存的成绩,于是python为了根绝此类景象,强迫的将递归层数管制正在了997(只需997!你买没有了吃亏,买没有了受骗...).

  拿甚么来证实这个“998实践”呢?这里咱们能够做一个试验:

def foo(n):
    print(n)
    n += 1
    foo(n)
foo(1)

  由此咱们能够看出,未报错以前能看到的最年夜数字就是998.当然了,997是python为了咱们顺序的内存优化所设定的一个默许值,咱们当然还能够经过一些手法去修正它:

import sys
print(sys.setrecursionlimit(100000))

  咱们能够经过这类形式来修正递归的最年夜深度,刚刚咱们将python容许的递归深度设置为了10w,至于实际能够达到的深度就取决于较量争论机的功能了。不外咱们仍是没有保举修正这个默许的递归深度,由于假如用997层递归都不处理的成绩要末是没有适宜应用递归来处理要末是你代码写的太烂了~~~

  看到这里,你可能会感觉递归也并非如许好的货色,没有如while True好用呢!但是,江湖下流传这这样一句话叫做:人了解轮回,神了解递归。以是你可别小视了递归函数,不少人被拦正在年夜神的门坎外这么多年,就是由于没能意会递归的真理。并且之后咱们学习的不少算法城市以及递归无关系。来吧,只有学会了才有资源厌弃!

2、递归示例解说

  这里咱们又要举个例子来讲明递归能做的事件。

  例一:

  如今你们问我,alex教师多年夜了?我说我没有通知你,但alex比 egon 年夜两岁。

  你想晓得alex多年夜,你是否是还患上去问egon?egon说,我也没有通知你,但我交锋sir年夜两岁。

  你又问武sir,武sir也没有通知你,他说他比太白年夜两岁。

  那你问太白,太白通知你,他18了。

  这个时分你是否是就晓得了?alex多年夜?

1金鑫18
2武sir20
3egon22
4alex24

  你为何能晓得的?

  起首,你是否是问alex的春秋,后果又找到egon、武sir、太白,你挨个儿问过来,不断到拿到一个切实的谜底,而后顺着这条线再找回来,才失去终极alex的春秋。这个进程曾经十分靠近递归的思维。咱们就来详细的我剖析一下,这几集体之间的法则。

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

  那这样的状况,咱们的函数怎样写呢?

def age(n):
    if n == 1:    
      return 40
    else:     
         return age(n-1)+2print(age(4))

  假如有这样一个列表,让你从这个列表中找到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]

  你说,so easy!

  l.index(66)...

  咱们之以是用index办法能够找到,是由于python帮咱们完成了查找办法。假如,index办法没有给你用了。。。你还能找到这个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]
i = 0for num in l:    if num == 66:
        print(i)
    i+=1

  下面这个办法就完成了从一个列表中找到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]

  你察看这个列表,这是否是一个从小到年夜排序的有序列表呀?

  假如这样,如果我要找的数比列表两头的数还年夜,是否是我间接正在列表的后半边找就好了?

827651-20170730200049162-1549215684.png

  这就是二分查找算法!

  那末落实到代码上咱们应该怎样完成呢?

  简略版二分法

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)

  晋级版二分法

l1 = [1, 2, 4, 5, 7, 9]
def two_search(l,aim,start=0,end=None):
    end = len(l)-1 if end is None else end
    mid_index = (end - start) // 2 + start    
    if end >= start:
            if aim > l[mid_index]:
                        return two_search(l,aim,start=mid_index+1,end=end
             elif aim < l[mid_index]:
                 return two_search(l,aim,start=start,end=mid_index-1)        
             elif aim == l[mid_index]:
                 return mid_index        
             else:
                 return '不此值'
    else:
         return '不此值'
print(two_search(l1,9))

以上就是Python递归函数,二分查找算法简介的具体内容,更多请存眷资源魔其它相干文章!

标签: Python 二分查找算法 python教程 python编程 python使用问题 递归函数

抱歉,评论功能暂时关闭!