如何在python中使用递归

时间:2016-10-15 12:29:19

标签: python python-3.x

我正在努力解决刺激机器人运动的问题。机器人从位置(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']}))

4 个答案:

答案 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)

代码将打印您希望它执行的操作。您希望如何实际处理输出取决于您。