程序可以运行,但有一个奇怪的递归错误(Python)

2024-04-27 03:34:11 发布

您现在位置:Python中文网/ 问答频道 /正文

import sys
def get_majority_element(arr):
    if len(arr) < 2:
        return arr[0]

    midpoint = len(arr) // 2
    left = arr[:midpoint]
    right = arr[midpoint:]

    majority_left = 0
    majority_right = 0


    temp_left = get_majority_element(left)
    if temp_left != None:
        majority_left = temp_left



    temp_right = get_majority_element(right)
    if temp_right != None:
        majority_right = temp_right


    counterLeft = 0
    counterRight = 0

    for x in range( len(arr) ):
        if arr[x] == majority_left:
            counterLeft+=1
        elif arr[x] == majority_right:
            counterRight+=1

    if counterLeft > len(arr) // 2:
        return majority_left
        #return 1
    elif counterRight > len(arr) // 2:
        return majority_right
        #return 1
    else:
        return 0


input = sys.stdin.read()
n, *arr = list(map(int, input.split()))


result = get_majority_element(arr)
print(result)

****免责声明:代码解决了问题并通过了所有测试用例。然而。。。。return语句中有一个bug,我不太清楚。现在,它将正确返回任何数组中的多数元素。你知道吗

但是,如果将当前return语句替换为带注释的return语句(return 1),则返回值不是1。这怎么可能? 不知何故,当返回到调用方func时,返回1变成了0?你知道吗

输入: 五

2 3 9 2

输出:2

以下是分而治之的方法: 假设数组a=[2 3 9 2 2]。你把它分成b1=[23]和b2=[92]。然后将b1拆分为b11=[2]和b12=[3]。然后返回2和3,并计算它们在b1中的出现次数。你知道吗

如果其中一个在b1中发生超过(n/2=2/2=1)次,则它们是b1的多数元素。否则,b1不包含多数元素,返回0。然后,您的程序将使用与上面相同的过程递归地开始分割b2。然后,它将看到b2中的一个多数元素是2,并计算它在a中出现的次数,得出结论,它在a中出现的次数超过(n/2=5/2=2)次,因此它是一个多数元素。你知道吗


Tags: right元素getlenreturnifelementleft
1条回答
网友
1楼 · 发布于 2024-04-27 03:34:11

非常简单:当您从所有调用返回1或0时,对于mailty\u leftmailty\u right中的每一个,您都会使用这两个值中的一个到达顶层。在列表中查找1和0时,没有。你知道吗

即使将这些作为项目计数,也会在顶层返回failure,因为1+1不大于5//2。你知道吗

相关问题 更多 >