我已经在下面设置了这个任务:
你是一艘帆船的船长,你和你的船员被海盗俘虏了。海盗船长让你们所有人在他的船甲板上站成一圈,试图决定你应该走哪条木板。最终他决定采用以下方法:
(a)海盗船长要求你挑选一个号码。
(b)第一个走板的人是第N人 (从你开始)。
(c)然后队长将继续围绕圆圈强迫每个N. 走路的人。
(d)一旦只剩下一个人,将给予该人 自由度。
例如:工作人员包括:Andrew,Brenda,Craig,Deidre, 爱德华,费利西蒂,格雷格和哈丽特。安德鲁选择N = 2。船员会 按顺序走木板:Brenda,Deidre,Felicity,Harriet,Craig, 格雷格,爱德华。安德鲁将获得自由。
我在这里找到了一个与此任务相关的问题和答案,但我想知道我的代码在哪里出错了,必须可以不使用以前答案中使用的模块。
到目前为止我所拥有的:
def survivor(names, step):
next = step
while len(names) > 1:
names.pop(next)
next = next + step - 1
if next > len(names):
next = next - len(names)
return names[0]
然后是错误:
Pirates.survivor(["Andrew", "Brenda", "Craig", "Deidre", "Edward", "Felicity", "Greg", "Harriet"], 3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "Pirates.py", line 30, in survivor
names.pop(next)
IndexError: pop index out of range
答案 0 :(得分:2)
因为计算机科学的计数从0开始,你需要以与更新它相同的方式初始设置next
,即
next = step - 1
在给出的示例中,您使用N=2
运行并且应该返回Brenda,但是如果您不将步骤减1,则首先弹出'Craig'
。进行此更改可使代码运行并在给定示例上输出正确的结果。
我建议的另一个更改是使用模运算符来确保next
始终是names
的有效索引。它更简洁,更容易理解:
next = (next + step - 1) % len(names)
将所有这些放在一起你有以下几点:
def survivor(names, step):
next = step-1
while len(names) > 1:
print "-", names.pop(next), "walked"
next = (next + step - 1) % len(names)
return names[0]
print survivor(["Andrew", "Brenda", "Craig", "Deidre", "Edward", "Felicity", "Greg", "Harriet"], 2), "survived!"
输出:
- Brenda walked
- Deidre walked
- Felicity walked
- Harriet walked
- Craig walked
- Greg walked
- Edward walked
Andrew survived!
最后,正如其他地方所指出的那样,不要在内置函数next
之后命名变量。
答案 1 :(得分:0)
您的索引错误意味着您的代码正在尝试访问列表中不存在的索引。当我在每个while循环迭代结束时打印出next
变量时,我得到了这个:
5
1
3
1
3
由于python开始在0
开始编制索引,并且由于此时列表中只有3个元素,因此它会查找names[3]
,但您的列表只会上升到names[2]
< / p>
此外,我不会将next
用作变量,因为它是关键字。