如何在Python中递归地实现一个方法

时间:2014-02-11 20:00:05

标签: python recursion

我试图以递归方式实现此方法。但是,几秒钟后,我得到一个索引错误语句“无法从空堆栈中弹出”。我怎么能纠正这个?从本质上讲,整个代码(我没有包括)的重点是创建一个迷宫并引导机器人通过它。

空(未探索)细胞
EMPTY = 0

有障碍的细胞
OBSTACLE = 1

路径上的单元格 ON_PATH = 2

已经探索过的细胞,但不在路径上 EXPLORED = 3

机器人所在的单元格 ROBOT = 4

def solve(self, location):  

    eventType, done = None, False
    self.maze[location[0]][location[1]] = ROBOT  
    if self.mode == GRAPHICAL_FULL:  
        self.display_init()  
        self.draw_maze()  
    elif self.mode == GRAPHICAL_LIMITED:  
        self.display_init()  
        self.update_maze()  
    while eventType != QUIT and not done:  
        if self.mode == GRAPHICAL_FULL or self.mode == GRAPHICAL_LIMITED:  
            for event in pygame.event.get():  
                eventType = event.type
        new_location = self.find_next_step() 
        if new_location is None:  
            # Mark the current location as a dead end  
            self.maze[location[0]][location[1]] = EXPLORED  
            # pop the next cell off the path stack (go back one space)  
            location = self.path.pop()
            self.maze[location[0]][location[1]] = ROBOT
            self.solve(location)   
        else:  
            self.maze[location[0]][location[1]] = ON_PATH  
            self.path.push(location)  
            location = new_location
            self.solve(location)
        if self.mode == GRAPHICAL_FULL or self.mode == GRAPHICAL_LIMITED:  
            self.clock.tick(self.framerate)  
            self.update_maze()  
            self.screen.blit(self.background, (0,0))  
            pygame.display.flip()  
        if (self.maze[0][0] == EXPLORED or
            location == (self.dimension['x']-1, self.dimension['y']-1)):  
            self.path.push(location)  
            done = True
    return self.path


def find_next_step(self):  
    # Search for a place to go  
    for direction in SEARCH_ORDER:  
        new_location = (self.location[0] + direction['x'],  
                        self.location[1] + direction['y'])  
        if (0 <= new_location[0] < self.dimension['x'] and
            0 <= new_location[1] < self.dimension['y'] and
            self.maze[new_location[0]][new_location[1]] == EMPTY):  
            self.maze[new_location[0]][new_location[1]] = ROBOT  
            return new_location  
    return None

2 个答案:

答案 0 :(得分:1)

由于只在new_location为None时才调用pop,self.find_next_step()返回none。如果没有find_next_step()的代码,很难确定,但我的猜测是机器人遍历了所有路径,回到起点(使用空路径),因此.pop()失败。

无论如何,我建议错误发生在find_next_step()的返回值中。

这不是一个真正的答案,但我还没有代表发表评论,希望这会有所帮助;)

<强>更新

好吧,我现在有更多的信息,但我仍然感觉还有很长的路要走。

但是,如果find_next_step中没有None的空值,direction似乎会返回SEARCH_ORDER。 (虽然我不知道方向是什么样的。SEARCH_ORDER大概是一个常量?(不是一个大的python用户))。

无论如何,当机器人探索或以其他方式识别find_next_step所看到的所有细胞时,可能就是这种情况。

答案 1 :(得分:0)

没有足够的应用程序可以确定,但我认为你的问题是在模式的最后。当您移动到最终位置时,再次调用solve()。在这个循环中,你将获得new_location是None并开始向后移动直到你到达第一个位置,并且你得到错误,因为你不能再从你的路径中弹出位置。在所有事情都解开之后,才会调用断开递归循环的检查。

将此类支票的“已完成”检查移动......

location = new_location
if not done:
    self.solve(location)