eachconfig = [['a', ['blank', ['p1', 'r', 'r'], ['b']]], ['b', ['blank', ['p0'], ['c']]], ['c', ['blank', ['r', 'r'], ['a']]]]
def turingmachine(data):
a = 0
tape = []
finalmc = data[0][0]
for z in range(1,40):
tape.append(' ')
mcName = []
m = 0
for emc in range(1,len(data)+1):
goal = data[m][0]
mcName.append(goal)
m+=1
mcNumber = [h-1 for h in range(1,len(mcName)+1)]
mcNameNumber = dict(zip(mcName,mcNumber))
d = 0
tapeposition = d
tapescan = tape[d]
for process in range(1,len(tape)):
b = 0
c = 0
cconfig = data[a][b]
if cconfig == finalmc:
b += 1
scannedsymbol = data[a][b][c]
if isinstance(scannedsymbol, str):
if scannedsymbol.lower() in ('any', 'blank'):
c += 1
operations = data[a][b][c]
for cycle in operations:
if cycle[0] in ('p','P'):
tape[tapeposition] = cycle[1:]
elif cycle[0] in ('r', 'R'):
tapeposition += 1
elif cycle[0] in ('l', 'L'):
tapeposition -= 1
elif cycle[0] in ('e', 'E'):
tape[tapeposition] == ' '
finalmc = data[a][b][-1][0]
a = mcNameNumber[finalmc]
return tape
print turingmachine(eachconfig)
我的效率在这段代码中可能并不令人惊讶,也不完整,它只是当前“eachconfig”列表中设置数据的框架。尽管如此,该程序的输出仍然是[1, ' ', ' ', ' ', ...]
,它应该是[1, ' ' , 0 , ' ' , 1 , ' ' , 0 , ...]
我已经阅读了几十次代码,我已经通过打印出每行来检查错误了,我发现问题是它只迭代循环一次(有问题的循环是for process in range(1,len(data)+1):
循环,在那之前的循环仅用于初始化),但我无法弄清楚原因。为什么会这样?
答案 0 :(得分:2)
简单回答:因为你的return语句在for循环中。所以,可能只是一个缩进错误。
但是,我必须说,这段代码非常非Pythonic。你正在做很多迭代遍历范围,这应该总是一个红旗:在Python中你通常想要迭代一个实际的东西,而不是一个特殊构造的范围。在任何情况下,由于你甚至没有使用循环变量(process
),你应该考虑for循环是否是正确的结构。
另外,正如火山在评论中指出的那样,大多数设置代码都可以大大缩短。
答案 1 :(得分:1)
你在内循环中返回tape
,process in range(...)
,所以只发生一次迭代。您的tape
也不够长,每个tape
可用空间都会进行多次操作,我也没有找到任何“终止”符号,所以它永远不会长到{{1}条件。
这是“固定”代码:
for