Ханойские башни в 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)
Объяснение кода листинга программы
Код решает задачу Ханойских башен с помощью рекурсивного бэктрекинга. Он использует стек для хранения текущего состояния, и если состояние уже было решено, он использует эту информацию, чтобы избежать повторных вычислений. Код состоит из следующих функций:
- hanoi: Главная функция, которая задает начальное состояние, вычисляет решение и печатает его.
- try-move: Функция, которая проверяет, можно ли переместить верхний диск из одного стержня на другой.
- get-key: Функция, которая генерирует ключ для хранения состояния в хеше.
- steps: Функция, которая генерирует последовательность ходов для решения задачи.
- solved?: Функция, которая проверяет, является ли текущее состояние решением задачи.
- start-state: Функция, которая создает начальное состояние.
- show-line: Функция, которая печатает одну строку состояния.
- show-res: Функция, которая печатает результат для определенного варианта.
- solve-depth: Рекурсивная функция, которая решает задачу в глубину.
- solve-wide: Рекурсивная функция, которая решает задачу в ширину. Список переменных и их значений:
- n: Количество дисков
- memo: Хеш для хранения уже вычисленных состояний.
- a, b, c: Стержни (представлены как символы).
- vars: Все возможные варианты состояний.
- nexts: Варианты состояний, которые еще не были вычислены.
- start-state: Начальное состояние.
- show-line: Функция для печати одной строки состояния.
- show-res: Функция для печати результата для определенного варианта.
- solved?: Функция для проверки, является ли текущее состояние решением задачи.
- try-move: Функция для проверки, можно ли переместить верхний диск из одного стержня на другой.
- get-key: Функция для генерации ключа для хранения состояния в хеше.
- steps: Функция для генерации последовательности ходов для решения задачи.
- solve-depth: Рекурсивная функция для решения задачи в глубину.
- solve-wide: Рекурсивная функция для решения задачи в ширину. Код сначала задает начальное состояние, затем вычисляет последовательность ходов для решения задачи и печатает результат. Затем он использует хеш memo для хранения уже вычисленных состояний, чтобы избежать повторных вычислений.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д