zoukankan      html  css  js  c++  java
  • 递归函数,二分查找

    1.递归函数

    2.二分查找

    递归函数:自己调用自己,默认递归次数:998.   递归到一定次数就会主动终止,998次(为了保护内存)

    例: def  func():

        print(666)

        func()

      func()

    上面的例子就是简单的递归函数.

    可设置递归函数的次数

    import sys

    sys.setrecursionlimit(设定次数)

    def  func(n):

      n += 1
      print

      func(n)

    n = 0

    func(n)

    """alex比佩奇大两岁  

    佩奇比文周大两岁

    文周比太白大两岁

    太白26岁

    """

    def  age(n):

      if  n == 1:

        return 26

      else:

        return age(n-1) +2

    print(age(4))  #age(3) + 2

    里面的操作流程分解

    """

    def  age(4):

      if n == 1:

        return 26

      else:

        return age(3) +2

    def  age(3):

      if n == 1:

        return 26

      else:

        return age(2) + 2

    def age(2):

      if n == 1:

        return 26

      else:

        return age(1) +2

    def age(1):

      if n == 1:

        return 26

      else:

        return age(0) + 2

    print(age(4))

    age(4) = 26 + 2+ 2+2

    以上就是简单的递归函数.比较绕,喜欢的可以深入了解.

    二分查找:二分查找算法,最经典最简单的算法.

    使用二分查找算法前提:有序的 不重复的数字序列.

     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  index(1,aim):

      count = -1

      for i in l:

        count += 1

        if i == aim:

          return count

      return "没有此值"

    print(index(l,84)

    用这种方法很慢,如果数据太大的话,就不合适用这种方法.下面我们用一下二分查找算法来实现.

    第一版  原列表发生改变,导致索引改变.

    l = [2,3,5,10,15,16,18]

    def two_find(l,aim):

      mid_index = len(l)//2

      if aim>l[mid_index]:

        return two_find(l[mid_index]+1:],aim)

      elif aim<l[mid_index]:

        return two_find(l[:mid_index],aim)

      elif aim == l[mid_index]:

        return mid_index

      else:

        return None

    print(two_find(l,18)

    上面这个二分查找算法是错误的,因为每次调用都会改变索引,得到的结果只有0或者1,这不是我们想要的,所以根据上面的问题我们进行了修改.

    l = [2,3,5,10,15,16,18]

    def  func(l,a,start = 0,end = None):

      end = len(l) if end != None else end=None

      a_index=(end+start)//2

      if end >=start:

        if a > l[a_index]:

          return func(l,a,start = a_index+1,end=end)

        elif a< l[a_index]:

          return func(l,a,start = start,end = a_index-1)

        elif a == l[a_index]:

          return a_index

      else:

        return None

    print(func(l,a))

    上面这个就是正确的二分查找法,很绕很绕,一定要理解性记忆,否则会死的很惨,有问题一定要及时解决,不要耽搁,弄明白.

  • 相关阅读:
    javascript高级程序设计---Event对象三
    javascript高级程序设计---Event对象二
    javascript高级程序设计---Event对象
    javascript高级程序设计---CSS操作
    javascript高级程序设计---Element对象
    javascript高级程序设计---document节点
    javascript高级程序设计---NodeList和HTMLCollection
    javascript高级程序设计---DOM
    Javascript高级程序设计——客户端检测
    学习javascript系列之变量
  • 原文地址:https://www.cnblogs.com/fengkun125/p/9214580.html
Copyright © 2011-2022 走看看