代码之家  ›  专栏  ›  技术社区  ›  W.tan

一维最短距离递归算法

  •  1
  • W.tan  · 技术社区  · 3 年前

    你好,我正在学习使用递归,基本上我在尝试做一个“1D最短距离算法”。

    然而,我在中间感到困惑,因为我不知道如何在递归(第14,15行)之后获取值。

    def recCPairDist(points):
        if len(points) == 1:
            return 0
        elif len(points)== 2:
            abs(points[1]-points[0])
            #how do i assign the result final value back to "leftDist rightDist"
            #since its a recurisive, the result can be more than 1, should i store all the result in a list first?
            #then get the min(list)?
    
        else:
            mid = len(points) // 2
            first_half = points[:mid]
            second_half = points[mid:]
            leftDist = recCPairDist(first_half)
            rightDist = recCPairDist(second_half)
            midDist = abs(second_half[0] - first_half[1]) #i dont think this is correct since i didnt consider the recursion
            return min(leftDist,rightDist,midDist)
    
    def cPairDist(points):
        points.sort()
        return recCPairDist(points)
    
    P1 = [7, 4, 12, 14, 2, 10, 16, 6]
    
    cPairDist(P1)
    

    P1的预期结果应为“1”,因为最短距离应在7到6之间

    1 回复  |  直到 3 年前
        1
  •  1
  •   BrokenBenchmark Miles Budnek    3 年前

    你真的很接近!你必须做三件事:

    1. 对于只有一点要考虑的情况,你应该 回来 0 .例如,对于数组 [3, 6, 9] ,答案是3,但给定的基本情况将返回 0 。这是因为对于奇数长度数组,其中一个子数组的长度为1,当您从每个递归调用返回时,零返回值将传播。
    2. 您需要返回值 abs(points[1]-points[0]) len == 2 使用 return 关键词。
    3. 对于递归情况,最小差值必须在左半部分的两个连续元素之间、右半部分的两个连续元素之间,或者在前半部分的最后一个元素和后半部分的第一个元素之间(原始数组中的两个连续元素,但在两个递归情况中不包括)。所以,你的 midDist 应计算此值。

    下面是一段代码片段,它解决了这三个问题:

    def recCPairDist(points):
        if len(points) == 1:
            return float('inf')
        elif len(points)== 2:
            return abs(points[1]-points[0])
        else:
            mid = len(points) // 2
            first_half = points[:mid]
            second_half = points[mid:]
            leftDist = recCPairDist(first_half)
            rightDist = recCPairDist(second_half)
            midDist = abs(first_half[-1] - second_half[0])
            return min(leftDist,rightDist,midDist)