如何找到最小的N.

时间:2012-11-21 17:27:27

标签: python python-2.7

我有一个代码,可以在这个场景中从名单列表中确定幸存者,列表中的最后一个人幸存下来 我的代码是:

names =  ["Andrew", "Brenda", "Craig", "Deidre", "Edward", "Felicity", "Greg", "Harriet"]
def survivor(names, step):
    Next = step - 1
    while len(names) > 1:
        names.pop(Next)
        Next = Next + step
        Next = (Next - 1) % len(names)
        print names

    return names[0]

这可以根据步骤中的内容返回幸存者,但我还需要计算出最小的N,以便一个人能够生存下去,例如3为格雷格,2为安德鲁。

我为此尝试的代码是:

assert name in names
for step in survivor(names, step):
    if survivor == name:
        return step

但它一直在说明在赋值或全局步骤之前引用的局部变量步骤。

assert name in names
for step in itertools.count(1):
    if survivor(names, step) == name:
        return step

但是会返回

['Brenda','Craig','Deidre','Edward','Felicity','Greg','Harriet']

['Craig','Deidre','Edward','Felicity','Greg','Harriet']

<'>''Deidre','Edward','Felicity','Greg','Harriet']

['Edward','Felicity','Greg','Harriet']

['Felicity','Greg','Harriet']

['Greg','Harriet']

[ '哈丽特']

这不是我想要的

任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

此循环不符合您的预期。你想要的应该是这样的:

def shortest(name):
    assert name in names
    for step in range(1, len(names)+1):
        #Go through all possible steps, from 1 to number of items (the +1 is to include the last item too)
        if survivor(names[:], step) == name: # Check that this item matches
            return step # Break out of the loop when you get to it

itertools.count(1)会起作用,但您也可以使用while True,并且步长大于名称列表的长度是没有意义的。

您的问题可能是名字数组在第一个名字后变空。因为您pop了所有元素,并修改了全局范围内的names列表(在函数中定义)。所以你必须复制它(使用names[:]list(names),它们都会达到同样的目的。)

这是我做的测试:

for n in names:
    print n, shortest(n)

输出:

Andrew 2
Brenda None
Craig 5
Deidre 7
Edward None
Felicity 4
Greg 3
Harriet 1

注意:我不知道为什么那里有None ...但你提供的例子确实匹配了!

答案 1 :(得分:1)

for step in survivor(names, step):

注意您在这里两次使用step的方式。如何将Python传递给survivor函数,然后才能将它从函数中删除?

认为你想要的是range function。这将遍历从1到名称列表长度的每个step值:

for step in range(1, len(names)):

您的itertools.count版本也应该可以使用,现在我考虑一下。您是在检查此功能的返回值还是仅查看打印出来的内容?输出看起来像这一行:

print names

另一件事是,您的功能会在每次运行时更改原始列表,因为您更改了names并且您没有复制。也许你想在更改前复制一份:

def survivor(names, step):
    names = names[:]
    # etc

请参阅this question了解names[:]创建列表副本的原因。