使用二进制递归函数

时间:2017-04-19 04:36:24

标签: python recursion binary-search

因此,我已经被指示创建一个带有2个参数的函数,一个列表和一个数字,它使用二进制递归搜索来查看数字是否在列表中。如果数字在列表中,我将返回其索引,如果不是,我将返回-1。到目前为止我已经

def findIndex(alist,num):
     print(alist)
     if len(alist) % 2 == 0:
          mid = int((len(alist)/2)-1)
     else:
          mid = ((len(alist)//2))

     if alist[mid] == num:
          print(mid)
     elif alist[mid] > num:
          findIndex(alist[0:mid],num)
     elif alist[mid] < num:
          findIndex(alist[mid+1:],num)

我知道二进制搜索是如何工作的。如果不是您要搜索的号码,请将该号码与您正在搜索的号码进行比较。如果它大于您搜索的数字,请搜索列表的前半部分。如果较小,再次搜索列表的后半部分。问题是我的代码仅适用于I&#39; m搜索的数字小于每种情况下的中间数字的情况。

1 个答案:

答案 0 :(得分:1)

<强>分析

逻辑有几个问题。

  1. 删除的帖子确定了您最明显的问题:只有当搜索目标出现在一系列仅限左侧分区的中间时,您的搜索才有效。否则,当列表变为单个项目时,将打印0,索引。
  2. 如果目标不在列表中,当您尝试查找空列表的中点时,程序会在索引超出范围时崩溃。
  3. 你永远不会回报任何东西。打印结果与返回值不同。
  4. <强>解

    有两种直接的方法可以解决这个问题。第一种是使用 findIndex 作为包装函数,并编写要由其调用的函数。例如:

    def findIndex(alist,num):
        return binaryFind(alist, 0, len(alist), num)
    
    def binaryFind(alist, left, right, target):
        # Here, you write a typical binary search function
        #   with left & right limits.
    

    第二种方法是返回找到的索引,但是在切断列表左半部分的所有时间都要调整它。每个级别的调用都必须将该调整添加到返回值,将总和传递回上一级别。简单的情况看起来就是这样,你将在列表的右半部分重复出现:

        elif alist[mid] < num:
            return (mid+1) + findIndex(alist[mid+1:], num)
    

    这会让你走向一个有用的解决方案吗?