Arhn - архитектура программирования

Рекурсия обратного отслеживания в Haskell


  • часть NoWay/! была добавлена ​​вами, верно? Есть две вещи, которые могут пойти не так: во-первых, вы спускаетесь с noWay, но вы уже сделали это и увидели, что это невозможно с south, поэтому этот случай никогда не должен сопоставляться, и я не думаю, вы никогда не будете отмечать что-то с !. Почему бы вам не отметить это в регистре otherwise в конце (удалить регистр noWay) - это должно помочь. Я бы с удовольствием проверил это, если бы вы где-нибудь разместили полный код (с примером);) 07.08.2014
  • Это весь код. changeVal изменяет значение по координате, а check проверяет значение по координате. 07.08.2014

Ответы:


1

Сразу видно, что причина вашей проблемы в том, что

| otherwise = (False, maze)

использует исходный maze вместо того, чтобы возвращать обновленный. Однако даже замена его на snd noWay не даст вам желаемого результата. (Я думаю, что !s будет отмечать только часть к югу от вашей начальной точки.)

Существует более серьезная проблема: при переходе к следующему рекурсивному шагу ваша функция не сохраняет метки, поставленные на предыдущем шаге, а вместо этого снова начинает с исходного maze. Вместо этого следующий рекурсивный шаг должен начинаться с окончательных маркировок лабиринта, созданных предыдущим. Например. (поскольку ваши охранники идут на восток -> юг -> запад -> север) вам нужно south остановиться там, где закончилось east, с чем-то вроде

south = path (snd east) x (y+1)

Если вы закрепите все направления одинаково, то noWay вам не понадобится. (К этому моменту не останется неотмеченных мест для проверки.) Вместо этого, если случай north потерпит неудачу, он пометит все, кроме вашей начальной точки, поэтому вы можете сделать

| otherwise = (False, changeVal (snd north) x y '!')
07.08.2014
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..