1

所以在这里我有几个我想使用的已定义列表:

(DEFINE list0 (LIST 'j 'k 'l 'm 'n 'o 'j) )
(DEFINE list1 (LIST 'a 'b 'c 'd 'e 'f 'g) )
(DEFINE list2 (LIST 's 't 'u 'v 'w 'x 'y 'z) )
(DEFINE list3 (LIST 'j 'k 'l 'm 'l 'k 'j) )
(DEFINE list4 (LIST 'n 'o 'p 'q 'q 'p 'o 'n) )
(DEFINE list5 '( (a b) c (d e d) c (a b) ) )
(DEFINE list6 '( (h i) (j k) l (m n) ) )
(DEFINE list7 (f (a b) c (d e d) (b a) f) )

我想做的是为'endsmatch'函数创建一个递归函数,它会这样做:

ENDSMATCH: (endsmatch 1st)如果#t列表中的第一个元素与列表中的最后一个元素相同则返回, #f否则返回。那是,

(endsmatch '(s t u v w x y z) ) 将/应该返回: #f

(endsmatch (LIST 'j 'k 'l 'm 'n 'o 'j)

将/应该返回: #t

两者都(endsmatch '())应该(endsmatch '(a)) 返回#t,等等。

该函数还可以读取复杂的列表,例如: (endsmatch '((a b) c (d e d) c (a b)) ) 然后返回: #t 和:

(endsmatch '((a b) c (d e d) c (b a)) )

(endsmatch '((y z) y) )

都应该返回#f

这个函数如何编码,因为我是方案新手,会看到它的样子,提前谢谢你。

4

2 回答 2

2

试试这个,它很简单:

(define (endsmatch lst)
  (if (null? lst)
      #t
      (equal? (first lst) (last lst))))

如果您的 Scheme 解释器不包含过程firstlast,它们的实现非常简单:

(define (first lst)
  (car lst))

(define (last lst)
  (cond ((null? lst) #f)
        ((null? (cdr lst)) (car lst))
        (else (last (cdr lst)))))
于 2012-11-14T22:09:10.360 回答
1

我想出了这个解决方案,但是对于您描述的最后两个测试它失败了:

(define (endsmatch lst)
  (let loop ((lst lst) (first '()) (last '()))
    (cond
      ((null? lst)         (eq? first last))
      ((pair? (car lst))   (loop (car lst) first last)
                           (loop (cdr lst) first last))
      ((null? first)       (loop (cdr lst) (car lst) (car lst)))
      (else                (loop (cdr lst) first (car lst))))))


; racket test code
(require rackunit)
(check-eq? (endsmatch '(s t u v w x y z)) #f)
(check-eq? (endsmatch (list 'j 'k 'l 'm 'n 'o 'j)) #t)
(check-eq? (endsmatch '()) #t)
(check-eq? (endsmatch '(a)) #t)
(check-eq? (endsmatch '((a b) c (d e d) c (b a))) #t)
; these fail
(check-eq? (endsmatch '((a b) c (d e d) c (b a))) #f)
(check-eq? (endsmatch '((y z) y)) #f)

确实你说的都是

"(endsmatch '((a b) c (d e d) c (b a)) ) which would then return: #t"

"(endsmatch '((a b) c (d e d) c (b a)) ) should return #f"

这是矛盾的。

于 2012-11-14T22:19:25.527 回答