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

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

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

Здравствуйте, кто-нибудь знает как эту программу переделать, чтобы она работала в LispWorks???
Листинг программы
  1. (defn hanoi (n)
  2. (print "ЗАДАЧА - ханойские башни, n = " n ":" \n)
  3. (defn try-move (f t)
  4. cond (null? f) false
  5. (or (null? t) (< (car f) (car t))) (cons (cdr f) (cons (car f) t) nil)
  6. false)
  7. (defn steps (chain)
  8. (match (car chain) '(a b c))
  9. (def vars (cons
  10. (cond (match (try-move a b) '(f t)) (cons f t c nil) nil)
  11. (cond (match (try-move a c) '(f t)) (cons f b t nil) nil)
  12. (cond (match (try-move b a) '(f t)) (cons t f c nil) nil)
  13. (cond (match (try-move b c) '(f t)) (cons a f t nil) nil)
  14. (cond (match (try-move c a) '(f t)) (cons t b f nil) nil)
  15. (cond (match (try-move c b) '(f t)) (cons a t f nil) nil)
  16. nil))
  17. (def nexts (filter (lambda (x) not (null? x)) vars))
  18. (map (lambda (n) cons n chain) (filter (lambda (v) not (elem v chain)) nexts)))
  19. (defn solved? (state)
  20. (match (car state) '(a b c))
  21. (and (null? a) (null? b)))
  22. (def start-state (cons (cons (list-from-to 1 n) nil nil nil) nil))
  23. (defn show-line (l) foldl (lambda (x a) print x " ") 0 l)
  24. (defn show-res (l i)
  25. (print \n "Вариант " i ":" \n)
  26. (defn go (l) cond (null? l) (+ i 1) ((show-line (car l)) (print \n) (go (cdr l)) ))
  27. (go l))
  28. (print "Поиск в глубину:")
  29. (show-res (reverse (solve-depth steps solved? start-state)) 1)
  30. (print \n "Поиск в ширину:" \n)
  31. (foldl (lambda (l a) show-res (reverse l) a) 1 (solve-wide steps solved? start-state)) )

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

textual
Листинг программы
  1. (defn hanoi (n)
  2. (print "ЗАДАЧА - ханойские башни, n = " n ":" \n)
  3.  
  4. (def memo (java (class "java.util.HashMap") "new"))
  5.  
  6. (defn try-move (f t)
  7. cond (null? f) false
  8. (or (null? t) (< (car f) (car t))) (cons (cdr f) (cons (car f) t) nil)
  9. false)
  10.  
  11. (defn get-key (l)
  12. (match l '(a b c))
  13. (++ (eval (cons ++ a)) "_" (eval (cons ++ b)) "_" (eval (cons ++ c)) ))
  14.  
  15. (defn steps (chain)
  16. (match (car chain) '(a b c))
  17. (def vars (cons
  18. (cond (match (try-move a b) '(f t)) (cons f t c nil) nil)
  19. (cond (match (try-move a c) '(f t)) (cons f b t nil) nil)
  20. (cond (match (try-move b a) '(f t)) (cons t f c nil) nil)
  21. (cond (match (try-move b c) '(f t)) (cons a f t nil) nil)
  22. (cond (match (try-move c a) '(f t)) (cons t b f nil) nil)
  23. (cond (match (try-move c b) '(f t)) (cons a t f nil) nil)
  24. nil))
  25. (def nexts (filter
  26. (lambda (x) and (not (null? x)) (not (java memo "containsKey" (get-key x)))) vars))
  27. (foldl (lambda (x a) java memo "put" (get-key x) true) 0 nexts)
  28. (map (lambda (n) cons n chain) (filter (lambda (v) not (elem v chain)) nexts)) )
  29.  
  30. (defn solved? (state)
  31. (match (car state) '(a b c))
  32. (and (null? a) (null? b)))
  33.  
  34. (def start-state (cons (cons (list-from-to 1 n) nil nil nil) nil))
  35.  
  36. (defn show-line (l) foldl (lambda (x a) print x " ") 0 l)
  37. (defn show-res (l i)
  38. (print \n "Вариант " i ":" \n)
  39. (defn go (l) cond (null? l) (+ i 1) ((show-line (car l)) (print \n) (go (cdr l)) ))
  40. (go l))
  41.  
  42. (print "Поиск в глубину:")
  43. (show-res (reverse (solve-depth steps solved? start-state)) 1)
  44.  
  45. (def memo (java (class "java.util.HashMap") "new"))
  46.  
  47. (print \n "Поиск в ширину:" \n)
  48. (foldl (lambda (l a) show-res (reverse l) a) 1 (solve-wide steps solved? start-state)) )
  49.  
  50. (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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут