【发布时间】:2014-05-07 06:45:03
【问题描述】:
所以,我有一个任务要求我使用递归解决一个迷宫。我将发布作业指南,以便您可以看到我在说什么。教授没有过多地解释递归,他给了我们递归的例子,我将发布,但我希望有人能够给我一个更深入的递归解释,以及我将如何应用它来解决一个迷宫。我不是要求任何人编写代码,我只是希望一些解释能让我走上正确的道路。感谢任何回答的人。
以下是我的示例:
def foo():
print("Before")
bar()
print("After")
def bar():
print("During")
def factorial(n):
"""n!"""
product = 1
for i in range(n,0,-1):
product *= i
return product
def recFac(n):
"""n! = n * (n-1)!"""
if(n == 1):
return 1
return n * recFac(n-1)
def hello():
"""Stack overflow!"""
hello()
def fib(n):
"""f(n) = f(n-1) + f(n-2)
f(0) = 0
f(1) = 1"""
if n == 0 or n == 1: #base case
return n
return fib(n-1) + fib(n-2) #recursive case
def mult(a,b):
"""a*b = a + a + a + a ..."""
#base case
if (b == 1):
return a
#recursive case
prod = mult(a,b-1)
prod *= a
return prod
def exp(a,b):
"""a ** b = a* a * a * a * a *.... 'b times'"""
#base case
if (b==0):
return 1
if (b == 1):
return a
#recursive case
return exp(a,b-1)*a
def pallindrome(word):
"""Returns True if word is a pallindrome, False otherwise"""
#base case
if word == "" or len(word)==1:
return True
#recursive case
if word[0] == word[len(word)-1]:
word = word[1:len(word)-1]
return pallindrome(word)
else:
return False
以下是指南:
你将创建一个迷宫爬虫,它能够利用递归的力量解决你给它的任何迷宫!
问题 1 - 加载迷宫
在解决迷宫之前,您必须先加载它。对于此作业,您将为迷宫使用简单的文本格式。您可以使用此示例迷宫或创建您自己的迷宫。
这个问题的目标是加载任何给定的迷宫文件,并将其读入二维列表。 例如:loadMaze("somemaze.maze") 应该加载 somemaze.maze 文件并创建如下列表...
[['#','#','#','#','#','#','#','#','#'],
['#','S','#',' ',' ',' ','#','E','#'],
['#',' ','#',' ','#',' ',' ',' ','#'],
['#',' ',' ',' ','#',' ','#',' ','#'],
['#', #','#','#','#','#','#','#','#']]
请注意,列表已删除所有“\r”和“\n”字符。为了使下一个问题更简单,您可以将此列表设为全局变量。
接下来编写一个以更好的格式打印出迷宫的函数:
例如,
####################################
#S# ## ######## # # # # #
# # # # # # #
# # ##### ## ###### # ####### # #
### # ## ## # # # #### #
# # # ####### # ### #E#
####################################
在继续之前用不同的迷宫测试你的代码。
问题 2 - 准备解决迷宫
在解决迷宫之前,您需要找到起点!在代码中添加一个名为 findStart() 的函数,它将搜索迷宫(逐个字符)并返回“S”字符的 x 和 y 坐标。您可以假设迷宫中最多存在一个这样的角色。如果在迷宫中没有找到“S”,则 x 和 y 坐标都返回 -1。
在继续之前在多个位置(包括无位置)使用“S”测试您的代码。
问题 3 - 解决迷宫!
最后,你准备好递归解决迷宫了!您的解决方案应该只需要一个方法:solve(y,x)
solve 方法的单个实例应该解决迷宫中的单个位置。参数 y 和 x 是要求解的当前坐标。您的解决方法应该完成一些事情。它应该检查它当前是否正在解决“E”的位置。在这种情况下,您的求解方法已成功完成。否则它应该尝试递归解决右边的空间。请注意,您的方法应该只尝试解决空间,而不是墙壁('#')。如果该递归没有导致结束,则尝试向下,然后向左,然后向上。如果一切都失败了,你的代码应该回溯一个步骤,并尝试另一个方向。
最后,在解决迷宫问题时,您的代码应该留下进度指示符。如果它正在向右搜索,则当前位置应该有一个“>”来代替空白空间。如果搜索下来放一个'v'。如果向左搜索'
一旦你的迷宫被解决,再次打印出迷宫。您应该查看走迷宫的分步指南。 例如,
main("somemaze.maze")
#########
#S# #E#
# # # #
# # # #
#########
S 在 (1,1)
#########
#S#>>v#E#
#v#^#>>^#
#>>^# # #
#########
使用不同的开始和结束位置测试您的代码,并且可以选择在各种迷宫中进行测试。
这是我目前的代码: 但是代码实际上并没有打印迷宫中的轨道,我不知道为什么。
def loadMaze():
readIt = open('Maze.txt', 'r')
readLines = readIt.readlines()
global mazeList
mazeList = [list(i.strip()) for i in readLines]
def showMaze():
for i in mazeList:
mazeprint = ''
for j in i:
mazeprint = mazeprint + j
print(mazeprint)
print('\n')
def solve(x,y, mazeList):
mazeList[x][y] = "o"
#Base case
if y > len(mazeList) or x > len(mazeList[y]):
return False
if mazeList[y][x] == "E":
return True
if mazeList[y][x] != " ":
return False
#marking
if solve(x+1,y) == True: #right
mazeList[x][y]= '>'
elif solve(x,y+1) == True: #down
mazeList[x][y]= 'v'
elif solve(x-1,y) == True: #left
mazeList[x][y]= '<'
elif solve(x,y-1) == True: #up
mazeList[x][y]= '^'
else:
mazeList[x][y]= ' '
return (mazeList[x][y]!= ' ')
【问题讨论】:
-
谢谢!我一直在寻找示例,但我没有找到对我真正有用的示例!这个似乎很有帮助。
-
没问题。如果您遇到任何其他问题,只需使用您的新查询更新问题
-
与迷宫解决没有直接关系,但我在过去几天尝试在这里stackoverflow.com/a/22678614/478656 展示/解释一个递归问题。
-
有人能告诉我为什么我更新的代码可能无法正常工作吗?