所以我在这里有一些我想要使用的定义列表:
(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
这个功能怎么可能被编码,因为我是计划的新手并且会看到它的样子,提前谢谢你。
答案 0 :(得分:2)
试试这个,就像它得到的一样简单:
(define (endsmatch lst)
(if (null? lst)
#t
(equal? (first lst) (last lst))))
如果您的Scheme解释器不包含first
和last
过程,那么它们实现起来非常简单:
(define (first lst)
(car lst))
(define (last lst)
(cond ((null? lst) #f)
((null? (cdr lst)) (car lst))
(else (last (cdr lst)))))
答案 1 :(得分: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"
这是矛盾的。