在列表上使用模运算符的方案

时间:2016-03-07 01:56:34

标签: list scheme modulo

我找到了列表的最大值,现在我想要返回数字,除了所有具有MAX值等于零的数字,并且我不太确定如何在整个列表中使用模运算符得到我需要的数字,任何人都可以引导我朝着正确的方向前进,这是我到目前为止所拥有的

(define (findlargest a_list)
(if (null? a_list) ;if its a empty list
    #f             ;its false
    (let loop ((a_list (cdr a_list)) ;binds the loop variable a_list to value of cdr a_list(second and all subsequent items in a list)
               (maxval (car a_list))) ;maxval is set to car of a_list (first item of the list)
      (cond ((null? a_list) maxval)   ;if the list is empty return max
            ((> (car a_list) maxval)  ;checks to see if the current element > max
             (loop (cdr a_list) (car a_list))) ;find a new max
            (else
        (loop (cdr a_list) maxval)));keeps the same max

1 个答案:

答案 0 :(得分:1)

您正在使用findlargest重新发明轮子,built-in procedure为此:

(define (findlargest lst)
  (apply max lst))

现在,关于你的问题 - 这对于filter来说似乎是一个完美的工作:

(define (filter-max-modulo lst)
  (let ((max-val (findlargest lst)))
    (filter (lambda (val)
              (not (zero? (modulo val max-val))))
            lst)))

例如:

(filter-max-modulo '(0 -2 -4 -3 -7 -1 2))
=> '(-3 -7 -1)