我正在努力解决刺激机器人运动的问题。机器人从位置(0,0,' N')开始。该命令在字符串列表中给出。转弯'函数从N转到E到S到W再回到N.移动函数在特定方向上移动:Y轴为N,S,x轴为E,W。 N:y + 1 S:y-1 W:x-1 E:x + 1
我遇到问题的部分是,当尝试在函数中使用快捷方式时。使用' turnleft'而不是['转向','转向','转向'],'转折'而不是转向'
# admin.py
class CircuitAdmin(admin.ModelAdmin):
list_display = ('title', 'get_date1', 'get_date2')
def get_date1(self, instance):
return instance.name.date1
get_date1.short_description = 'Date 1'
def get_date2(self, instance):
return instance.name.date2
get_date2.short_description = 'Date 2'
admin.register(Circuit, CircuitAdmin)
调用函数时:
def macro_interpreter(code, macros):
该术语的定义在字典中给出。 我的代码只运行第一个命令,然后终止,它忽略列表中的第二个代码
print(macro_interpreter(['turnleft', 'turnright'], {'turnleft': ['turn', 'turn', 'turn'], 'turnright' : ['turn'], 'bigleftturn' : ['move', 'move', 'turnleft', 'move', 'move'], 'bigrightturn' : ['move', 'move', 'turnright', 'move', 'move']}))
答案 0 :(得分:2)
如果你总是在else
命令的循环中点击一个code
语句,那么你永远不会因为command not in macros
而递归。
第一次迭代后,code == ['turn', 'turn', 'turn']
,但macros
不包含任何键"turn"
如果您希望更正确地执行此操作,那么您可以将x,y和“方向索引状态”作为参数传递给函数,然后在递归调用中递增/修改那些而不是仅修改局部变量该函数并始终在(0,0,0)处重新启动它们。
此外,除了使用index = (index + 1) % len(state)
之外,您需要替换该尝试,因为通过递增数字不会捕获任何IndexError
所以,像这样
state = ['N', 'E', 'S', 'W']
def macro_interpreter(code, macros, x=0,y=0,index=0):
# TODO: check if x or y have gone outside "the board"
# TODO: return to break from recursion
for command in code:
if command in macros:
return macro_interpreter(macros[command], macros,x,y,index)
else:
if command == 'move':
if state[index] == 'N':
return macro_interpreter(code[1:], macros,x,y=y+1,index)
答案 1 :(得分:1)
我在您的代码中做了一些修改以正确支持递归。这段代码会做什么,你想要实现什么。
def macro_interpreter(code, macros, x=0, y=0, index=0):
state = ['N', 'E', 'S', 'W']
for command in code:
if command in macros:
x, y, curr_state = macro_interpreter(macros[command], macros, x, y, index)
# update new index with new state value
index = state.index(curr_state)
else:
if command == 'move':
if state[index] == 'N':
y += 1
elif state[index] == 'E':
x += 1
elif state[index] == 'S':
y -= 1
elif state[index] == 'W':
x -= 1
elif command == 'turn':
index = (index + 1)%len(state)
return (x, y, state[index])
现在,如果我运行你的测试用例
>> print macro_interpreter(['turnleft', 'turnright'], {'turnleft': ['turn', 'turn', 'turn'], 'turnright' : ['turn'], 'bigleftturn' : ['move', 'move', 'turnleft', 'move', 'move'], 'bigrightturn' : ['move', 'move', 'turnright', 'move', 'move']})
Output:- (0, 0, 'N')
我希望这会对你有所帮助。
答案 2 :(得分:0)
该行
return macro_interpreter (macros etc.
会做到这一点。它将离开for循环并从外部调用返回。故事结束。
答案 3 :(得分:0)
我怀疑是因为你回来了
macro_interpreter(macros[command], macros)
一旦运行递归代码,这只会退出函数。您将看到是否更改
return macro_interpreter(macros[command], macros)
到
print macro_interpreter(macros[command], macros)
代码将打印您希望它执行的操作。您希望如何实际处理输出取决于您。