我正在尝试编写一个谓词函数,当列表被定义为拉链时,该函数返回TRUE。拉链被定义为一个正确的列表,其中每个元素都是一个只包含两个元素的列表,可以是任何表达式。
一个例子是
(zipper? '((a 1)(b 2)))
#t
(zipper? '((a (1)) ((b) 2)))
#t
(zipper? '((a 1 2)(b 1)))
#f
我试图首先检查参数列表是否已满并返回false,然后检查列表中的汽车是否有元素长度,然后通过我的函数传回列表的cdr,但是我无法获取它正在运行。
(define (zipper? l)
(if (empty? l)
#f
(if (> 1 (length car(l)))
#t
(zipper? (cdr (l))))))
知道我做错了什么以及如何解决它?我还在学习计划。
答案 0 :(得分:2)
对于这种情况,最好使用cond
而不是一系列嵌套if
,它们会给您带来麻烦。并且最好将测试当前元素是否为“zip”的谓词提取到单独的过程中。像这样:
(define (zip? e)
(and (list? e)
(= (length e) 2)))
(define (zipper? lst)
(cond ((null? lst) #t)
((not (zip? (car lst))) #f)
(else (zipper? (cdr lst)))))
当然,还有其他几种方法可以解决这个问题。例如,使用布尔连接器而不是条件:
(define (zipper? lst)
(or (null? lst)
(and (zip? (car lst))
(zipper? (cdr lst)))))
或使用Racket的andmap
(如果不可用,请使用SRFI-1的every
):
(define (zipper? lst)
(andmap zip? lst))
答案 1 :(得分:1)
你的括号错了
(define (zipper? l)
(if (empty? l)
#f
(if (> 1 (length (car l)))
#t
(zipper? (cdr l))))))
该函数始终是表达式中的第一个元素,其余是参数。它与规范不完全匹配
(define (zipper? l)
(if (empty? l)
#t
(if (not (= 2 (length (car l))))
#f
(zipper? (cdr l))))))