Функция вызова ракетки для каждого элемента списка - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь написать функцию, которая принимает список делителей, список чисел для проверки и применяет деление по каплям к каждому элементу списка делителей. Я должен использовать фильтр, карту или сворачивание, а не рекурсию

Я написал делимую по капле функцию:

(define (drop-divisible l n)
 (cond
  [(empty? l) empty]
  [(empty? (rest l)) l]
   (let ([i (first l)])
    (if (zero? (modulo i n))
    (drop-divisible (rest l) n)
    (cons i (drop-divisible(rest l)n))))]))

Кажется, это работает, но я запутался в том, как я могу вызвать drop-делимое для каждого элемента в списке, когда ему нужен только один список и целое число в качестве параметра?

Надеюсь, это имеет смысл, спасибо

1 Ответ

0 голосов
/ 18 сентября 2018

Если вы хотите «все элементы этого списка, кроме тех, которые соответствуют такому-то критерию», функция filter предоставляет простой способ сделать это:

(define (drop-divisible l n)
  (filter (λ (i) (not (zero? (modulo i n))))
          l))

> (drop-divisible '(4 6 9 8 12 14) 3)
'(4 8 14)

filter создает новый список, содержащий только те элементы исходного списка, которые соответствуют вашему критерию. Первый аргумент filter - это функция, которая принимает один элемент списка и возвращает #f, если элемент должен быть пропущен при создании нового списка, и возвращает любое другое значение для включения элемента в новый список. Второй аргумент filter - это список для фильтрации.

Другими словами, filter делает именно то, что делает ваш код, но оно обобщено для применения любого критерия фильтрации.

...