多数函数'递归限制除了'在Python中

时间:2014-05-12 12:48:15

标签: python recursion

我正在研究一个多数函数,如果一个元素在列表长度超过2加1:(len(list) // 2 + 1)的列表中,则该函数应该计算。

以下是我的代码:

def majority(mylist):
    global global_length 
    global_length = len(mylist)
    counter=0   
    if len(mylist)>0:
        for x in mylist:     #counts how many times the first element is in the list
            if x == mylist[0]:
                counter+=1
        eval (mylist,counter)  #eval checks if an element is a majority or not.
    else:
        return ("The list has no majority")


def eval(mylist,counter):  
        if counter>global_length:
            return (mylist[0], "is majority")
        else:
            A1 =[y for y in A if y!=A[0]] #new list w/ non-majority Element
        majority(A1)

我正在使用#pythontutor检查问题所在,并且函数确实在某个时刻给出了想要的结果,但是然后没有停止,最后它没有输出或错误。

有谁看到发生了什么?我是Python的新手,2小时后我看不到它。

1 个答案:

答案 0 :(得分:1)

对于auld lang syne,让我们回顾一下您的代码问题:首先,不要为您的函数使用内置的Python函数名称,即让我们调用eval()之类的东西is_majority(); is_majority()进行了错误的测试,将counterglobal_length进行比较而不是global_length // 2 + 1; is_majority()函数应该返回majority(A1)调用的结果,而不是隐式返回None;类似地,majority()函数应该return调用is_majority()的结果,而不是将其丢弃在地板上; is_majority()函数通过两个不同的名称mylistA引用其列表参数 - 应该是相同的。

我相信您的递归限制的答案超出了'是以上的组合加上这个逻辑:

def majority(mylist):
    global global_length 
    global_length = len(mylist)

虽然您已将global_length设为全局,但它在每次递归时仍会发生变化,因此无法作为测试。为了使其有用,我们需要做类似的事情:

global_length = 0

def majority(mylist):
    global global_length
    ...
    if len(mylist) > 0:
        if global_length == 0:
            global_length = len(mylist)

即。只在第一次调用时设置它,但在递归时使用它。

让我们重新开始吧。首先,让我们使用Python的全部内容来定义majority()函数,以确定黄金标准结果。我们让函数返回一个元组(element, count)None,让调用者很好地为用户打印这个结果:

from collections import Counter

def majority(mylist):
    [(element, count)] = Counter(mylist).most_common(1)

    if count > len(mylist) // 2:
        return (element, count)

    return None

test_list = ['A', 'B', 'A', 'C', 'A', 'D', 'A']

result = majority(test_list)

if result:
    element, count = result

    print(element, "is majority")
else:
    print("The list has no majority")

虽然我们不会使用结果的count部分,但用户可能对此感兴趣,我们将在下面的递归解决方案中使用它。

现在我们已经定义了这应该如何工作,让我们回到您的实现。您使用了一种具有两个相互递归函数的方法。为简化起见,我将把它减少到一个递归函数,该函数返回上面定义的结果。我还要消除总是使递归复杂化的全局变量:

def majority(mylist):
    if mylist:
        target = len(mylist) // 2
        element = mylist[0]
        count = 0

        for x in mylist:
            if x == element:
                count += 1

        if count > target:
            return (element, count)

        mysublist = [y for y in mylist if y != element]

        # if element is majority of mylist, must be majority of mysublist
        result = majority(mysublist)

        if result:
            element, count = result

            if count > target:
                return (element, count)

    return None

<强> USAGE

> python3 test.py
A is majority
>