Ханойские башни Common Lisp

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

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

Есть 3 стержня, на один из которых нанизаны 8 дисков, причем диски отличаются размером и лежат меньшее на большем. Задача состоит в том,чтобы перенести пирамиду из n-дисков за наименьшее число ходов. За один раз можно перенести только 1 диск, причем нельзя класть больший на меньший. Все это реализуется с помощью списков и поиска в ширину. На Common Lisp Кто-нибудь знает как это сделать? я нашла такое задание на scheme, но в common lisp переделать не получается на scheme
Листинг программы
  1. ;;; Создание колышка
  2. (define (peg token count)
  3. ;; Список p - это "внутренняя структура" колышка
  4. (let ((p (reverse (generaten count))))
  5. (define (display-peg)
  6. (display token)
  7. (display ": ")
  8. (display p)
  9. (newline))
  10. (define (push-ring! ring)
  11. (set! p (cons ring p))
  12. (display-peg))
  13. (define (pop-ring!)
  14. (let ((ring (car p)))
  15. (set! p (cdr p))
  16. (display-peg)
  17. ring))
  18. (define (peg-token)
  19. token)
  20. (define (height)
  21. (length p))
  22. (lambda (mes)
  23. (cond ((eq? mes 'display)
  24. (display-peg))
  25. ((eq? mes 'push-ring)
  26. push-ring!)
  27. ((eq? mes 'pop-ring)
  28. (pop-ring!))
  29. ((eq? mes 'token)
  30. (peg-token))
  31. ((eq? mes 'height)
  32. (height))
  33. (else
  34. error "peg -- неизвестное сообщение" mes)))))
  35. ;;; Печать колышка
  36. (define (display-peg peg)
  37. (peg 'display))
  38. ;;; Поместить кольцо на колышек
  39. (define (push-ring! peg ring)
  40. ((peg 'push-ring) ring))
  41. ;;; Изъять кольцо с колышка
  42. (define (pop-ring! peg)
  43. (peg 'pop-ring))
  44. ;;; Метка данного колышка
  45. (define (peg-token peg)
  46. (peg 'token))
  47. ;;; Высота (число колец) колышка
  48. ;;; (для решения задачи так и не понадобилась)
  49. (define (peg-height peg)
  50. (peg 'height))
  51. ;;; Вспомогательная функция
  52. ;;; создает список из убывающих чисел от number до 1 (включительно)
  53. (define (generaten number)
  54. (if (= 0 number)
  55. '()
  56. (cons number (generaten (- number 1)))))
  57. ;;; Функция переноса кольца с колышка peg-from на колышек peg-to
  58. (define (move peg-from peg-to peg)
  59. (display "Перенос кольца с колышка '")
  60. (display (peg-token peg-from))
  61. (display "' на колышек '")
  62. (display (peg-token peg-to))
  63. (display "':")
  64. (newline)
  65. (push-ring! peg-to (pop-ring! peg-from))
  66. * (display-peg peg))
  67. (define (hanoi-tower height)
  68. (let ((a (peg 'a height))
  69. (b (peg 'b 0))
  70. (c (peg 'c 0)))
  71. (display "Состояние колышков до переноса:")
  72. (newline)
  73. (display-peg a)
  74. (display-peg b)
  75. (display-peg c)
  76. ;;; Вся полезная работа происходит тут
  77. (let hanoi ((peg-a a)
  78. (peg-b b)
  79. (peg-c c)
  80. (n height))
  81. (cond ((not (= n 0))
  82. (hanoi peg-a peg-c peg-b (- n 1))
  83. (move peg-a peg-c peg-b)
  84. (hanoi peg-b peg-a peg-c (- n 1))))))
  85. 'конец)
  86.  
  87. вывод
  88. > (hanoi-tower 4)
  89. Состояние колышков до переноса:
  90. a: (1 2 3 4)
  91. b: ()
  92. c: ()
  93. Перенос кольца с колышка 'a' на колышек 'b':
  94. a: (2 3 4)
  95. b: (1)
  96. c: ()
  97. Перенос кольца с колышка 'a' на колышек 'c':
  98. a: (3 4)
  99. c: (2)
  100. b: (1)
  101. Перенос кольца с колышка 'b' на колышек 'c':
  102. b: ()
  103. c: (1 2)
  104. a: (3 4)
  105. Перенос кольца с колышка 'a' на колышек 'b':
  106. a: (4)
  107. b: (3)
  108. c: (1 2)
  109. Перенос кольца с колышка 'c' на колышек 'a':
  110. c: (2)
  111. a: (1 4)
  112. b: (3)
  113. Перенос кольца с колышка 'c' на колышек 'b':
  114. c: ()
  115. b: (2 3)
  116. a: (1 4)
  117. Перенос кольца с колышка 'a' на колышек 'b':
  118. a: (4)
  119. b: (1 2 3)
  120. c: ()
  121. Перенос кольца с колышка 'a' на колышек 'c':
  122. a: ()
  123. c: (4)
  124. b: (1 2 3)
  125. Перенос кольца с колышка 'b' на колышек 'c':
  126. b: (2 3)
  127. c: (1 4)
  128. a: ()
  129. Перенос кольца с колышка 'b' на колышек 'a':
  130. b: (3)
  131. a: (2)
  132. c: (1 4)
  133. Перенос кольца с колышка 'c' на колышек 'a':
  134. c: (4)
  135. a: (1 2)
  136. b: (3)
  137. Перенос кольца с колышка 'b' на колышек 'c':
  138. b: ()
  139. c: (3 4)
  140. a: (1 2)
  141. Перенос кольца с колышка 'a' на колышек 'b':
  142. a: (2)
  143. b: (1)
  144. c: (3 4)
  145. Перенос кольца с колышка 'a' на колышек 'c':
  146. a: ()
  147. c: (2 3 4)
  148. b: (1)
  149. Перенос кольца с колышка 'b' на колышек 'c':
  150. b: ()
  151. c: (1 2 3 4)
  152. a: ()
  153. конец

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

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

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


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

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

7   голосов , оценка 3.571 из 5

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

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

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