1

我正在尝试编写一个谓词函数,该函数在将列表定义为拉链时返回 TRUE。拉链被定义为一个正确的列表,其中每个元素都是一个只有两个元素的列表,并且可以是任何表达式。

一个例子是

(zipper? '((a 1)(b 2)))
#t
(zipper? '((a (1)) ((b) 2)))
#t
(zipper? '((a 1 2)(b 1)))
#f

我尝试首先检查参数列表是否已满并返回 false,然后检查列表的 car 到其元素长度,并通过我的函数将列表的 cdr 传回,但我无法让它运行。

(define (zipper? l)
  (if (empty? l)
    #f
  (if (> 1 (length car(l)))
    #t
  (zipper? (cdr (l))))))

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

4

2 回答 2

2

对于这种情况,最好使用 acond而不是一系列嵌套if的 s,它们会给您带来一些麻烦。最好将测试当前元素是否为“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))
于 2013-06-23T23:49:13.877 回答
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))))))
于 2013-06-23T23:37:57.893 回答