【问题标题】:Python error: recursion exceeded maximum depth cmpPython 错误:递归超出最大深度 cmp
【发布时间】:2021-05-02 05:05:33
【问题描述】:

我正在编写一个 Python 程序以递归方式在二维数组中查找目标,以解决 this 问题。我正在使用二进制搜索方法递归查找目标是否存在,但它给了我这个最大递归深度超出错误。有什么建议吗?

我的代码:

def searchMatrix(self, matrix, target):
    small = [0,0]
    big = [len(matrix)-1,len(matrix[0])-1]
    return self.searchUtil(matrix,target,small,big)
    
def searchUtil(self,matrix,target,small,big):
    if big >= small:
        #find the mid target
        midx,midy = (small[0]+big[0])/2,(small[1]+big[1])/2
        if matrix[midx][midy] == target:
            return True
        #if mid is >= target, it will exclude all the element smaller than it
        if matrix[midx][midy] >= target:
            return self.searchUtil(matrix,target,[midx,0],[midx,midy-1]) or self.searchUtil(matrix,target,[0,midy],[midx-1,midy]) or self.searchUtil(matrix,target,[0,0],[midx-1,midy-1])
        else:
        #if mid is < target, it will exclude all the element bigger than it
            return self.searchUtil(matrix,target,[midx+1,0],[len(matrix)-1,midy]) or self.searchUtil(matrix,target,[0,midy+1],[midx,len(matrix[0])-1]) or self.searchUtil(matrix,target,[midx+1,midy+1],[len(matrix)-1,len(matrix[0])-1])
    else:
        return False

【问题讨论】:

  • 我建议你使用元组而不是数组来区分大小。
  • 在searchUtil中,首先if语句应该检查big == small
  • 你认为解在对角线上吗?否则,您应该单独更改坐标。
  • 由于对于这种规模的问题没有理由进行适当的二分搜索来达到递归限制,因此您在更新大小时一定有错误保持big &gt;= small,因此递归循环永远不会结束。一个问题是你有midx,midy = (small[0]+big[0])/2,(small[1]+big[1])/2 这是浮点而不是整数除法。这应该会导致以下行出现错误if matrix[midx][midy] == target:,因为数组索引应该是整数。尝试整数除法,即使用//
  • 如果矩阵从最小值到最大值排序,则发布的二进制搜索算法将适用,但事实并非如此。只有单独的行和列是有序的,而不是整个矩阵。

标签: python algorithm binary-search


【解决方案1】:

正如@DarrylG 所指出的,在这种情况下,二进制搜索不适用。
这是我解决这个问题的方法:

def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        
        if matrix:
            row, col, width = len(matrix)-1, 0, len(matrix[0])
            
            while row>=0 and col<width:
                if matrix[row][col]==target:
                    return True
                elif matrix[row][col]>target:
                    row -= 1
                else:
                    col += 1
                    
        return False
 
#  Or this one liner:  [it passed too]
#  return any(target in row for row in matrix)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-28
    • 2021-12-11
    • 1970-01-01
    • 2017-08-24
    • 2016-12-10
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    相关资源
    最近更新 更多