【发布时间】:2018-11-15 16:43:48
【问题描述】:
我在 Common Lisp 中有一个工作程序,我正试图让它在 Scheme 中也能工作,但它不工作。该代码是关于名为 vecinos
的结构中的深度优先搜索
Lisp 代码:
(setq vecinos '((a . (b c d))
(b . (a h))
(c . (a g))
(d . (g))
(g . (c d k))
(h . (b))
(g . (k)) ) )
( cdr (assoc 'a vecinos))
( cdr (assoc 'b vecinos))
(defmacro get.value (X vecinos) `(cdr (assoc, X, vecinos)))
(defun extiende (trayectoria)
(mapcar #'(lambda (nuevo-nodo) (append trayectoria (list nuevo-nodo)))
(remove-if #'(lambda (vecino) (member vecino trayectoria))
(get.value (car (last trayectoria)) vecinos))))
(defun primero-en-profundidad (inicial final)
(primero-en-profundidad-aux inicial final (list (list inicial))))
(defun primero-en-profundidad-aux (inicial final abierta)
(cond ((eq inicial final)
(print (list inicial)))
((member (list inicial final) (extiende (list inicial)))
(print (list inicial final)))
((member final (first abierta))
(print (first abierta)))
(t (primero-en-profundidad-aux inicial final (append (extiende (first abierta)) (rest abierta))))
))
(primero-en-profundidad 'a 'a)
(primero-en-profundidad 'a 'k)
方案代码:
#lang scheme
(define vecinos '((a . (b c d))
(b . (a h))
(c . (a g))
(d . (g))
(g . (c d k))
(h . (b))
(g . (k)) ) )
(define (get-value X vecinos)
(cond ((eq? (assoc X vecinos) #f) null)
(#t (cdr (assq X vecinos)) ) ))
我认为这是错误的,因为在 Scheme 中,extiende 的定义中没有使用 remove-if
(define (extiende trayectoria)
(map car (lambda (nuevo-nodo) (append trayectoria (list nuevo-nodo)))
(remove-if (lambda (vecino) (member vecino trayectoria))
(get-value (car (last trayectoria)) vecinos))))
(define (primero-en-profundidad inicial final)
(primero-en-profundidad-aux inicial final (list (list inicial))))
(define (primero-en-profundidad-aux inicial final abierta)
(cond ((eqv? inicial final)
(print (list inicial)))
((member (list inicial final) (extiende (list inicial)))
(print (list inicial final)))
((member final (first abierta))
(print (first abierta)))
(#t (primero-en-profundidad-aux inicial final (append (extiende (first abierta)) (rest abierta))))
))
结果应该是
(primero-en-profundidad '(a) '(a))
(一)
(primero-en-profundidad '(a) '(k))
(A C G K)
【问题讨论】:
-
不要把
mapcar翻译成map car,它们不等价。
标签: scheme lisp common-lisp racket