![](/img/trans.png)
[英]How to find the greatest and smallest integers that satisfy abc…n =a^3 + b^3 … + n^3
[英]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.