【问题标题】:How do I keep a list of numbers I have already enountered?如何保存我已经遇到的号码列表?
【发布时间】:2013-04-10 15:30:26
【问题描述】:

正如标题所示,我目前正在使用 Python 开发 BASIC 模拟器。这是我解决这个问题的代码:

def getBASIC():
   l = []
   x = 1
   while x == 1:
      i = input()
      l.append(i)
      if len(i.split()) != 3:
         x = 0
   return l

def findLine(prog, target):
   for l in range(0, len(prog)):
      progX = prog[l].split()
      if progX[0] == target:
          return l

 def execute(prog):
      location = 0
      visited = [False] * len(prog)
      while True:
        T = prog[location].split()[2]
        location = findLine(prog, T)
        visited[location] = True
      if visited[len(visited)-1] == False:
          return "infinite loop"
      else:
          return "success"

第一个函数做了它打算做的事情——将 BASIC 代码的输入转换成一个列表。第二个函数 findLine 也做了它打算做的事情,因为它找到包含等于输入的字符串的项目。然而,最后一个功能,我无法开始工作。我知道我必须做什么,那就是检查它的一部分是否被访问过两次。由于 while 循环的存在,我无法弄清楚如何做到这一点。因此,该函数的后半部分只是占位符。如果您能帮我弄清楚如何解决这个问题,将不胜感激。谢谢。

【问题讨论】:

  • Python 3 - BASIC Simulator 的可能重复项
  • 请使用真正反映您的问题的标题。
  • 两件事:1. 在你的循环中,如果你到达最后一行,则设置一个退出条件。 2. 不要使用while True,而是限制程序可以执行的步数(例如:for i in range(1000000)
  • @CharlesBrunet 我意识到这在技术上是重复的,但是我很久以前提交了这个问题,以至于任何人都无法真正考虑回答它。除此之外,我已经接受了你的回答。问题是,虽然您的回答很有帮助并给了我一些指导,但它不包含任何代码,我坚持实际编写代码。
  • 看起来您的第三个函数正在尝试检测您的程序是永远循环还是最终停止。您可能希望跳过该功能,因为不可能解决图灵完备语言(例如 BASIC)的 Halting Problem

标签: python python-3.x


【解决方案1】:

您保留已访问过的地点的列表(您已经这样做了),然后当您遇到 goto 时,检查它是否对已访问过的行进行,如果已访问过,则退出.

现在的一个错误是您创建的列表与程序一样长。这很没有意义。只需保留访问过的行号列表,然后检查

if current_line in visited:

【讨论】:

  • 我不太确定这将如何工作,但是在循环该列表中的项目数后,列表中的最后一项(结束)是否为假表示无限循环?不过,我不确定该怎么做。我可以实现什么来让程序计算访问了多少次?
  • @dan:“但在循环列表中的项目数后,列表中的最后一项(结束)是否为假表示无限循环?” - 我无法解析那个问题。
  • @dan:“我可以实现什么来让程序计算访问了多少次?”您有一本字典,其中列出了访问过的事物以及访问过的次数。
  • 我之前尝试过最后一项 == False 方法,但这只有在程序检查它是否已经循环列表的长度时才有效。我怎么能这样做?或者,我如何检查一行是否被重复访问?
  • @Dan:我不知道你为什么要检查最后一项是否 == False。 “我如何检查一行是否被重复访问”-我已经回答过:您有一本字典,其中列出了已访问的内容以及已访问的次数。
【解决方案2】:

尝试添加一个 if 语句,声明访问列表中的一行在循环中遇到时为真。这是我的解决方案:

    def execute(prog):
       location = 0
       visited=[False]*len(prog)
   while True:
           if location==len(prog)-1:
           return "success"
       if visited[location]==True:
           return "infinite loop"
       if visited[location]==False:
           visited[location]=True
       line2strings=prog[location].split()
       T=line2strings[-1]
       location=findLine(prog, T)

【讨论】:

    猜你喜欢
    • 2015-08-03
    • 2016-10-10
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 2014-06-06
    • 1970-01-01
    相关资源
    最近更新 更多