程序有效,但有一个奇怪的递归错误(Python)

时间:2017-03-20 05:04:53

标签: python recursion

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)

****免责声明:该代码解决了问题并通过了所有测试用例。但是......返回声明中有一个我无法弄清楚的错误。现在,它将正确返回任何数组中的多数元素。

但是,如果用返回的语句替换当前的返回语句(返回1),则返回值不是1.这怎么可能呢? 不知何故,返回1变为0,因为它返回到调用者函数?

输入: 5

2 3 9 2 2

输出:2

以下是分而治之的方法: 假设您有数组a = [2 3 9 2 2]。你将它分成b1 = [2 3]和b2 = [9 2 2]。然后将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)次,因此它占多数元件。

1 个答案:

答案 0 :(得分:0)

非常简单:当您从所有来电中返回1或0时,您将使用 majority_left majority_right 中的每一个的两个值中的一个达到顶级。当你在列表中查找1和0时,没有。

即使您将这些作为项目计数,您也会在顶层返回失败,因为1 + 1不大于5 // 2.