我不确定我是否同意两次访问一条线证明了一个无限循环。请参阅问题下面的评论。但我能回答实际的问题。
提示如下:A hint given by the tutorial assistant says "initialize a list visited = [False] * len(prog) and change visited[i] to True when prog[i] is visited. Each time through the loop, one value updates in visited[]. Think about how you change a single value in a list. Then think about how you identify which value in visited[] needs to change."
这意味着您应该有两个列表,一个包含程序,一个包含true/false标志。第二个名为visited,最初包含False值。
Python代码就像提示所说的:visited = [False] * len(prog)
这使用*list操作符“list repetition”来重复length-1列表并生成一个更长的新列表。
将visited[i]更改为True很简单:visited[i] = True
然后你可以这样做:if visited[i]:
print("We have already visited line {}".format(i))
print("Infinite loop? Exiting.")
sys.exit(1)
注意,我们只是通过简单地说if visited[i]:来测试True值
我们也可以编写if visited[i] == True:,但是较短的格式就足够了,而且在Python社区中是很常见的。这里记录了这个习惯用法和其他习惯用法:http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html
对于一个这么小的程序来说,保留两个这样的列表并不算太坏。对于更大更复杂的程序,我更喜欢把所有东西放在一个地方。这将使用一个你可能还没学会的“类”。像这样的:class ProgramCode(object):
def __init__(self, statement):
self.code = statement
self.visited = False
prog = []
with open(input_basic_program_file, "rt") as f:
for line in f:
prog.append(ProgramCode(line))
现在,我们没有两个列表,而是有一个列表,其中每个项都是一些基本代码和一个visited标志。
p.S.上面显示了一个显式的for循环,它反复使用.append()来添加到列表中。一个有经验的Python开发人员可能会使用“列表理解”来代替,但我希望尽可能容易地理解它。
这是对列表的理解。别担心现在看起来有点怪,你的课最终会教给你的。with open(input_basic_program_file, "rt") as f:
prog = [ProgramCode(line) for line in f]