Итак, у меня есть задание, которое просит меня разрешить лабиринт с использованием рекурсии. Я опубликую руководство по назначению, чтобы вы могли видеть, о чем я говорю. Профессор не так много объяснял рекурсию, он привел примеры рекурсии, которую я опубликую, но я надеялся, что кто-то сможет дать мне более подробное объяснение рекурсии и как я применил бы это к решению лабиринт. Я не прошу кого-либо написать код, я просто надеюсь, что некоторые объяснения приведут меня на правильный путь. Спасибо всем, кто отвечает.Решение лабиринта с использованием рекурсии в python
Вот примеры у меня есть:
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','#'],
['#',' ','#',' ','#',' ',' ',' ','#'],
['#',' ',' ',' ','#',' ','#',' ','#'],
['#', #','#','#','#','#','#','#','#']]
Обратите внимание, что списки были лишены всех «\ г» и ' \ n '. Чтобы упростить следующий вопрос, вы можете сделать этот список глобальной переменной.
Следующая написать функцию, которая выводит из лабиринта в гораздо более удобном формате:
Е.Г.,
####################################
#S# ## ######## # # # # #
# # # # # # #
# # ##### ## ###### # ####### # #
### # ## ## # # # #### #
# # # ####### # ### #E#
####################################
Проверьте свой код с различными лабиринтами перед продолжением.
Вопрос 2 - Подготовка к решению лабиринту
Перед тем, как можно решить лабиринт вам нужно найти отправную точку! Добавьте функцию в свой код под названием findStart(), который будет искать лабиринт (по-символу) и возвращать координату x и y символа «S». Вы можете предположить, что в лабиринте существует не более одного такого персонажа. Если в лабиринте return -1 не найдено «S» как координаты x и y.
Перед продолжением проверьте свой код с помощью «S» в нескольких местах (включая местоположение).
Вопрос 3 - Решение лабиринта!
Наконец, вы готовы рекурсивно разрешить лабиринт! Для вашего решения должен потребоваться только один метод: solve (y, x)
Один экземпляр метода разрешения должен решить одно место в вашем лабиринте. Параметры 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]!= ' ')
Может быть полезно: http://stackoverflow.com/questions/22700130/maze-solving-with-python – sshashank124
Спасибо! Я искал примеры, но я не нашел тот, который был действительно полезен для меня! Это кажется очень полезным. – MarissaLeigh
Нет проблем. Если вы столкнулись с какой-либо другой проблемой, просто обновите вопрос с помощью своих новых запросов. – sshashank124