以下是我拥有的例子:
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是要解决的当前坐标。您的solve方法应完成以下几项任务。它应检查是否正在解决'E'位置。在这种情况下,您的solve方法已成功完成。否则,它应尝试递归解决右侧的空格。请注意,您的方法应仅尝试解决空格,而不是墙('#')。如果该递归未导致结束,则尝试向下,然后向左和向上。如果所有这些都失败了,则您的代码应回溯一步,并尝试另一个方向。
最后,在解决迷宫时,您的代码应留下其进度的指示器。如果搜索右侧,则当前位置应有'>'代替空格。如果向下搜索,请放置“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]!= ' ')