【问题标题】:Recursive function in Python to search items within lists [closed]Python中的递归函数用于搜索列表中的项目[关闭]
【发布时间】:2021-05-07 07:44:26
【问题描述】:

我正在尝试/需要编写一个递归函数,如果元素在排序列表中,则返回 True/False 值。我必须不使用“in”关键字来获得答案。我的代码在下面,我想我很接近,但我似乎无法让函数返回正确的值:

def listSplitter(listToProcess, numToFind):
    lenOfList = len(listToProcess)

    if lenOfList == 1:
        if numToFind == listToProcess[0]:
            return True
        else:
            return False
    else:

        if lenOfList % 2 == 0:
            list1 = listToProcess[0:int(lenOfList / 2)]
            list2 = listToProcess[int(lenOfList / 2):int(lenOfList)]

            if list1[-1] >= numToFind and list1[0] <= numToFind:
                return (list1, numToFind)
                #return
            elif list2[-1] >= numToFind and list2[0] <= numToFind:
                return listSplitter(list2, numToFind)
                #return
        else:
            list1 = listToProcess[0:int(lenOfList / 2)]
            list2 = listToProcess[int(lenOfList / 2):int(lenOfList)]

            if list1[-1] >= numToFind and list1[0] <= numToFind:
                return listSplitter(list1, numToFind)
                #return
            elif list2[-1] <= numToFind and list1[0] >= numToFind:
                return listSplitter(list2, numToFind)
                #return



def ordered_contains(S, x):
    return listSplitter(S,x)
    #result = listSplitter(S, x)
    #return result



A = [2, 16, 26, 32, 52, 71, 80, 88]

print("A contains 32: {}".format(ordered_contains(A, 32)))
print("A contains 7: {}".format(ordered_contains(A, 7)))
print("A contains -10: {}".format(ordered_contains(A, -10)))
print("\n(Did those results match the earlier example?)")

这是输出:

A contains 32: ([2, 16, 26, 32], 32)
A contains 7: ([2, 16, 26, 32], 7)
A contains -10: None

(Did those results match the earlier example?)

我错过了什么?

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 只需使用while循环遍历列表的每个条目
  • 我必须使用递归,这是一个作业。
  • 您似乎错过了这一行中的函数调用:return (list1, numToFind)

标签: python recursion search


【解决方案1】:

看来你在第 16 行犯了一个错误:

不应该是return (list1, numToFind)

应该是return listSplitter(list1, numToFind)

另外,不需要if lenOfList % 2 == 0:。列表的长度是偶数还是奇数不会改变你的逻辑。

完整的代码如下所示

def listSplitter(listToProcess, numToFind): lenOfList = len(listToProcess)

if lenOfList == 1:
    if numToFind == listToProcess[0]:
        return True
    else:
        return False
else:

    list1 = listToProcess[0:int(lenOfList / 2)]
    list2 = listToProcess[int(lenOfList / 2):int(lenOfList)]

    if list1[-1] >= numToFind and list1[0] <= numToFind:
        return listSplitter(list1, numToFind)
    elif list2[-1] >= numToFind and list2[0] <= numToFind:
        return listSplitter(list2, numToFind)
    else:
        return False   

【讨论】:

    【解决方案2】:

    虽然可以纠正错字,但我尝试以另一种方式实现相同的效果。我通过递归模拟了一个while循环。看起来简单多了。

    In [0]: def traverse(index, array, toCompare):
       ...:     if (array[index] == toCompare):
       ...:         print(f"Found {toCompare} at {index + 1} position of the list")
       ...:         return # You can return a boolean True value and the index here and print it outside.
       ...:     if (index != len(array) - 1):
       ...:         traverse(index + 1, array, toCompare)
       ...:     else:
       ...:         print(f"Cannot find {toCompare} in list")
       ...:         return # You can return a boolean False value here and print it outside.
       ...:
    
    In [1]: traverse(0, a, 77)
    Cannot find 77 in list
    
    In [2]: traverse(0, a, 88)
    Found 88 at 8 position of the list
    
    In [3]: a
    Out[1]: [2, 16, 26, 32, 52, 71, 80, 88]
    

    只是想我会分享这个,因为它以更简单的方式实现了同样的效果。

    【讨论】:

      【解决方案3】:

      你的代码有一些问题:

      1. 错别字:
        • 第 16 行:return (list1, numToFind) -> return listSplitter(list1, numToFind)
        • 第 28 行:elif list2[-1] &lt;= numToFind and list1[0] &gt;= numToFind: -> elif list2[-1] &gt;= numToFind and list2[0] &lt;= numToFind:(如果这不是错字,那么我认为它在逻辑上不正确)
      2. 如果你更正上面的错别字,你会看到if lenOfList% 2 == 0:else两种情况下的代码是一样的。因此,没有必要将这两种情况分开。
      3. 的逻辑
        list1 = listToProcess[0:int(lenOfList / 2)]
        list2 = listToProcess[int(lenOfList / 2):int(lenOfList)]
        
        if list1[-1] >= numToFind and list1[0] <= numToFind:
            return listSplitter(list1, numToFind)
        elif list2[-1] >= numToFind and list2[0] <= numToFind:
            return listSplitter(list2, numToFind)
        
        将错过list1list2 有1 个元素并且它们都与numToFind 不同的情况。这就是为什么在某些情况下返回是None。要处理这种情况,只需在上面代码的末尾添加return False

      这是我纠正上述问题后的代码:

      def listSplitter(listToProcess, numToFind):
          lenOfList = len(listToProcess)
      
          if lenOfList == 1:
              return numToFind == listToProcess[0]
      
          list1 = listToProcess[0:int(lenOfList / 2)]
          list2 = listToProcess[int(lenOfList / 2):int(lenOfList)]
      
          if list1[-1] >= numToFind and list1[0] <= numToFind:
              return listSplitter(list1, numToFind)
          elif list2[-1] >= numToFind and list2[0] <= numToFind:
              return listSplitter(list2, numToFind)
          
          return False
      
      
      def ordered_contains(S, x):
          return listSplitter(S,x)
      
      
      A = [2, 16, 26, 32, 52, 71, 80, 88]
      
      print("A contains 32: {}".format(ordered_contains(A, 32)))
      print("A contains 7: {}".format(ordered_contains(A, 7)))
      print("A contains -10: {}".format(ordered_contains(A, -10)))
      print("\n(Did those results match the earlier example?)")
      

      输出:

      A contains 32: True
      A contains 7: False
      A contains -10: False
      
      (Did those results match the earlier example?)
      

      【讨论】:

        猜你喜欢
        • 2017-06-22
        • 2022-01-15
        • 1970-01-01
        • 2017-11-23
        • 1970-01-01
        • 1970-01-01
        • 2010-10-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多