Ханойские башни в LispWorks

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, кто-нибудь знает как эту программу переделать, чтобы она работала в LispWorks???
(defn hanoi (n)
(print "ЗАДАЧА - ханойские башни, n = " n ":" \n)
 
(defn try-move (f t)
cond (null? f) false
(or (null? t) (< (car f) (car t))) (cons (cdr f) (cons (car f) t) nil)
false)
 
(defn steps (chain)
(match (car chain) '(a b c))
(def vars (cons
(cond (match (try-move a b) '(f t)) (cons f t c nil) nil)
(cond (match (try-move a c) '(f t)) (cons f b t nil) nil)
(cond (match (try-move b a) '(f t)) (cons t f c nil) nil)
(cond (match (try-move b c) '(f t)) (cons a f t nil) nil)
(cond (match (try-move c a) '(f t)) (cons t b f nil) nil)
(cond (match (try-move c b) '(f t)) (cons a t f nil) nil)
nil))
(def nexts (filter (lambda (x) not (null? x)) vars))
(map (lambda (n) cons n chain) (filter (lambda (v) not (elem v chain)) nexts)))
 
(defn solved? (state)
(match (car state) '(a b c))
(and (null? a) (null? b)))
 
(def start-state (cons (cons (list-from-to 1 n) nil nil nil) nil))
 
(defn show-line (l) foldl (lambda (x a) print x " ") 0 l)
(defn show-res (l i)
(print \n "Вариант " i ":" \n)
(defn go (l) cond (null? l) (+ i 1) ((show-line (car l)) (print \n) (go (cdr l)) ))
(go l))
 
(print "Поиск в глубину:")
(show-res (reverse (solve-depth steps solved? start-state)) 1)
 
(print \n "Поиск в ширину:" \n)
(foldl (lambda (l a) show-res (reverse l) a) 1 (solve-wide steps solved? start-state)) )

Решение задачи: «Ханойские башни в LispWorks»

textual
Листинг программы
(defn hanoi (n)
    (print "ЗАДАЧА - ханойские башни, n = " n ":" \n)

    (def memo (java (class "java.util.HashMap") "new"))

    (defn try-move (f t)
        cond (null? f) false
             (or (null? t) (< (car f) (car t))) (cons (cdr f) (cons (car f) t) nil)
             false)

    (defn get-key (l)
        (match l '(a b c))
        (++ (eval (cons ++ a)) "_" (eval (cons ++ b)) "_" (eval (cons ++ c)) ))

    (defn steps (chain)
        (match (car chain) '(a b c))
        (def vars (cons
            (cond (match (try-move a b) '(f t)) (cons f t c nil) nil)
            (cond (match (try-move a c) '(f t)) (cons f b t nil) nil)
            (cond (match (try-move b a) '(f t)) (cons t f c nil) nil)
            (cond (match (try-move b c) '(f t)) (cons a f t nil) nil)
            (cond (match (try-move c a) '(f t)) (cons t b f nil) nil)
            (cond (match (try-move c b) '(f t)) (cons a t f nil) nil)
            nil))
        (def nexts (filter
            (lambda (x) and (not (null? x)) (not (java memo "containsKey" (get-key x)))) vars))
        (foldl (lambda (x a) java memo "put" (get-key x) true) 0 nexts)
        (map (lambda (n) cons n chain) (filter (lambda (v) not (elem v chain)) nexts)) )

    (defn solved? (state)
        (match (car state) '(a b c))
        (and (null? a) (null? b)))

    (def start-state (cons (cons (list-from-to 1 n) nil nil nil) nil))

    (defn show-line (l) foldl (lambda (x a) print x "  ") 0 l)
    (defn show-res (l i)
        (print \n "Вариант " i ":" \n)
        (defn go (l) cond (null? l) (+ i 1) ((show-line (car l)) (print \n) (go (cdr l)) ))
        (go l))

    (print "Поиск в глубину:")
    (show-res (reverse (solve-depth steps solved? start-state)) 1)

    (def memo (java (class "java.util.HashMap") "new"))

    (print \n "Поиск в ширину:" \n)
    (foldl (lambda (l a) show-res (reverse l) a) 1 (solve-wide steps solved? start-state)) )

(hanoi 8)

Объяснение кода листинга программы

Код решает задачу Ханойских башен с помощью рекурсивного бэктрекинга. Он использует стек для хранения текущего состояния, и если состояние уже было решено, он использует эту информацию, чтобы избежать повторных вычислений. Код состоит из следующих функций:

  1. hanoi: Главная функция, которая задает начальное состояние, вычисляет решение и печатает его.
  2. try-move: Функция, которая проверяет, можно ли переместить верхний диск из одного стержня на другой.
  3. get-key: Функция, которая генерирует ключ для хранения состояния в хеше.
  4. steps: Функция, которая генерирует последовательность ходов для решения задачи.
  5. solved?: Функция, которая проверяет, является ли текущее состояние решением задачи.
  6. start-state: Функция, которая создает начальное состояние.
  7. show-line: Функция, которая печатает одну строку состояния.
  8. show-res: Функция, которая печатает результат для определенного варианта.
  9. solve-depth: Рекурсивная функция, которая решает задачу в глубину.
  10. solve-wide: Рекурсивная функция, которая решает задачу в ширину. Список переменных и их значений:
  11. n: Количество дисков
  12. memo: Хеш для хранения уже вычисленных состояний.
  13. a, b, c: Стержни (представлены как символы).
  14. vars: Все возможные варианты состояний.
  15. nexts: Варианты состояний, которые еще не были вычислены.
  16. start-state: Начальное состояние.
  17. show-line: Функция для печати одной строки состояния.
  18. show-res: Функция для печати результата для определенного варианта.
  19. solved?: Функция для проверки, является ли текущее состояние решением задачи.
  20. try-move: Функция для проверки, можно ли переместить верхний диск из одного стержня на другой.
  21. get-key: Функция для генерации ключа для хранения состояния в хеше.
  22. steps: Функция для генерации последовательности ходов для решения задачи.
  23. solve-depth: Рекурсивная функция для решения задачи в глубину.
  24. solve-wide: Рекурсивная функция для решения задачи в ширину. Код сначала задает начальное состояние, затем вычисляет последовательность ходов для решения задачи и печатает результат. Затем он использует хеш memo для хранения уже вычисленных состояний, чтобы избежать повторных вычислений.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.462 из 5