我需要添加什么才能计算偶数列表中的零数?
例如,
(count-zeroes '((1 1 1) (1 0 0) (1 1 1) (1 0 0)))
4
是一个列表。
(define count-zeroes
(lambda (list)
(cond ((null? list) 0)
((= 0 (car list)) (+ 1 (count-zeroes (cdr list))))
(else (+ 0 (count-zeroes (cdr list))))
)
)
)
答案 0 :(得分:2)
(define count-zeroes
(lambda (list)
(cond ((null? list) 0) ; a
((= 0 (car list)) (+ 1 (count-zeroes (cdr list)))) ; b
(else (+ 0 (count-zeroes (cdr list))))))) ; c
如果列表最初是列表列表,那么(null?列表)就行 a 可以是真的(当你到达列表末尾时),但 b 行(= 0(车辆清单)) 永远不会是的,因为(车辆清单) 总是是另一个清单, 0 不是清单。
更好地解决这个问题的方法可能是首先提取偶数定位的子列表,然后将它们展平为单个列表,然后计算这些列表中的零。这不是最有效的高效方式(你会创建一些中间存储),但你应该首先实现类似的东西,然后逐步优化它。
值得注意的是,列表通常从位置0开始编入索引,因此列表中的第二,第四等元素是奇数位置,而不是甚至位置。这是一种抽象,可以帮助您开始使用这种方法:
(define first car)
(define rest cdr)
(define list* cons)
(define (odds list)
(if (null? list) '()
(evens (cdr list))))
(define (evens list)
(if (null? list) '()
(list* (first list)
(odds (rest list)))))
(define sample '((0 0 1) (0 1 0) (0 1 1) (1 0 0) (1 0 1) (1 1 0) (1 1 1)))
;; (display (odds sample))
;; => ((0 1 0) (1 0 0) (1 1 0))
答案 1 :(得分:0)
一个有趣的问题。如果您在列表列表上操作,则需要添加car-cdr recuresion。
GAGAGAGACAUAGAGGDUAUGAPGPPGG'UUGAACCAAUAGUAGGGGGUPCG"UUCCUUCCUUUCUUACCA
不仅仅是evens你不再计算零,所以一个新的函数名称是有序的。你可以组成这样一个更高阶的函数。
(define (count-zeroes lst) ;;don't override core function names with a variable
(cond ((null? lst) 0)
((pair? (car lst))
(+ (count-zeroes (car lst))
(count-zeroes (cdr lst))))
((= 0 (car lst))
(+ 1 (count-zeroes (cdr lst))))
(else (count-zeroes (cdr lst))))))
制作一般选择器
(define (count-zeros-of selector lst)
(count-zeroes (selector lst)))
把它们放在一起
(define (take-every-Xnth-at-y x y lst)
(cond ((null? lst) '())
((= y 0) (cons (car lst)
(take-every x (- x 1) (cdr lst))))
(else (take-every x (- y 1) (cdr lst)))))
请注意,这些部分中的每一部分都做了一件事并做得很好。