如何检查列表是否均匀

时间:2014-04-04 06:26:02

标签: scheme

我想测试列表是否为偶数。与(evenatom '((h i) (j k) l (m n o))一样,应回复#t,因为它有4个元素。

来自Google,I found how to check for odd

(define (oddatom lst)
  (cond
    ((null? lst)       #f)
    ((not (pair? lst)) #t)
    (else (not (eq? (oddatom (car lst)) (oddatom (cdr lst)))))))

要使其均匀,我是否只需将carcdrcdrcar交换?

我是Scheme的新手,只是想了解基础知识。

4 个答案:

答案 0 :(得分:1)

不,交换carcdr无法正常工作。但您可以交换#f#t

另外,虽然你给出的列表有4个元素,但是函数的作用实际上是遍历子列表并计算原子数,所以你真的要看8个原子。

答案 1 :(得分:1)

您找到odd atom使用' Google'并需要even atom。怎么样:

(define (evenatom obj) (not (oddatom obj)))

或者,增加一些复杂性,

(define (complement pred)
  (lambda (obj) (not (pred obj))))

然后

(define evenatom (complement oddatom))

答案 2 :(得分:0)

您正在混合一个过程来检查列表是否包含偶数个元素(不限于原子)以及检查列表结构中是否存在偶数个原子元素的过程。示例:((a b) (c d e) f)具有奇数个元素(3),但偶数(6)个原子。

如果你有一些弹珠,你如何确定你是否有奇数或偶数弹珠?你可以把它们视为正常,并检查结束总和的均匀度或计数1,0,1,0或奇数,偶数,奇数,即使这样你真的不知道我到底有多少弹珠,只有它是奇数或偶数。让我们两个:

(define (even-elements-by-count x)
  (even? (length x)))

(define (even-elements-by-boolean x)
  (let loop ((x x)(even #t))
     (if (null? x)
         even
         (loop (cdr x) (not even)))))

现在想象你还有一些杯子,并且他们有弹珠,你想知道同样的。你需要计算地板上的元素和杯子中的元素,也许杯子中还有一个带有元素的杯子。为此,您应该查看How to count atoms in a list structure并使用第一种方法或修改其中一种方法来更新均匀度而不是计算。

答案 3 :(得分:0)

偶数原子数相关联的程序的等价物是

(define (evenatom lst)
  (cond
    ((null? lst)       #t)
    ((not (pair? lst)) #f)
    (else (eq? (evenatom (car lst)) (evenatom (cdr lst))))))

您需要交换#t和#f,并省略最后一行的not子句。