我想测试列表是否为偶数。与(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)))))))
要使其均匀,我是否只需将car
与cdr
和cdr
与car
交换?
我是Scheme的新手,只是想了解基础知识。
答案 0 :(得分:1)
不,交换car
和cdr
无法正常工作。但您可以交换#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
子句。