Scheme拉链谓词函数

时间:2013-06-23 23:25:10

标签: function scheme predicate zipper

我正在尝试编写一个谓词函数,当列表被定义为拉链时,该函数返回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))))))

知道我做错了什么以及如何解决它?我还在学习计划。

2 个答案:

答案 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))))))