2016-03-07 6 views
0

Я нашел максимальное значение списка, и теперь я хочу вернуть числа, за исключением всех чисел, которые имеют модульное значение, равное нулю, с MAX-значением, и я не совсем уверен, как использовать по модулю оператора на весь список, чтобы получить номера мне нужно кто может привести меня в правильном направлении, это то, что я до сих порСхема с использованием оператора modulo в списке

(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

Вы изобретая колесо с 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)