偶数列表中的零数

时间:2015-12-07 15:18:51

标签: scheme

我需要添加什么才能计算偶数列表中的零数?

例如,

(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))))
    )      
  )
)

2 个答案:

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

请注意,这些部分中的每一部分都做了一件事并做得很好。