我正在研究一个多数函数,如果一个元素在列表长度超过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小时后我看不到它。
答案 0 :(得分:1)
对于auld lang syne,让我们回顾一下您的代码问题:首先,不要为您的函数使用内置的Python函数名称,即让我们调用eval()
之类的东西is_majority()
; is_majority()
进行了错误的测试,将counter
与global_length
进行比较而不是global_length // 2 + 1
; is_majority()
函数应该返回majority(A1)
调用的结果,而不是隐式返回None
;类似地,majority()
函数应该return
调用is_majority()
的结果,而不是将其丢弃在地板上; is_majority()
函数通过两个不同的名称mylist
和A
引用其列表参数 - 应该是相同的。
我相信您的递归限制的答案超出了'是以上的组合加上这个逻辑:
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
>