繁体   English   中英

如何找到最小的N

[英]How to find the smallest N

我有一个代码,在这种情况下,它会从一个名称列表中确定幸存者,以便在木板上行走,列表中的最后一个人幸存的代码如下:

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']

[“克雷格”,“迪德”,“爱德华”,“幸福”,“格雷格”,“哈里特”]

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

[“爱德华”,“幸福”,“格雷格”,“哈里特”]

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

['Greg','Harriet']

['Harriet']

这不是我想要的

谁能帮我解决这个问题?

此循环无法满足您的期望。 您想要的应该与此类似:

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 ……但是您提供的示例确实匹配!

for step in survivor(names, step):

请注意您在这里如何使用step两次。 Python应该如何在将其从该函数中删除之前将其传递给survivor函数?

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

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

现在,考虑到您的itertools.count版本也应该可以使用。 您是在检查此函数的返回值还是只是查看它的输出内容? 输出看起来像是来自以下行:

print names

另一件事是您的函数每次运行都会更改原始列表,因为您更改了names并且没有进行复制。 也许您想在更改之前进行复制:

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

有关names[:]为什么创建列表的副本的信息,请参见此问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM