Модификация списка в схеме с использованием встроенных функций и карты - PullRequest
1 голос
/ 28 марта 2020

Я пытаюсь создать функцию с именем changeList, которая изменяет список в схеме.

Функция должна сбрасывать каждое число от -1 до +1 включительно. Для каждого числа больше 1 его следует заменить числом, в 10 раз превышающим число. Для каждого числа, меньшего -1, оно должно заменить число абсолютным значением обратной величины.

Вот код, который у меня есть до сих пор

(define (changeList x) (map (lambda (x) (if (> x 1) (* x 10) (* (/ 1 x) -1))) x))

Вот пример желаемого вывода

(changeList '(0 -2 3 -4 1)) -> '( 1/2 30 1/4 )

Я могу оценить, если x больше 1 и если x меньше -1, однако у меня возникают проблемы с добавлением условного выражения операторы для оценки, если значение составляет от -1 до 1 включительно. Мне нужно пропустить это значение и не выводить его, что я не знаю, как это сделать.

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Было бы лучше, если сначала мы избавимся от чисел в диапазоне [-1, 1]: вот где filter пригодится. После этого мы можем применить map к результату шага фильтрации, реализуя необходимые правила. Это должно сработать:

(define (changeList lst)
  (map (λ (x) (if (> x 1) (* 10 x) (/ -1 x)))
       (filter (λ (x) (or (< x -1) (> x 1)))
               lst)))

В Racket мы можем выполнить идиому filter-затем-map за один шаг, и это также будет более эффективным:

(define (changeList lst)
  (filter-map (λ (x) (and (or (< x -1) (> x 1))
                          (if (> x 1) (* 10 x) (/ -1 x))))
              lst))

В любом случае, это работает как ожидалось:

(changeList '(0 -2 3 -4 1))
=> '(1/2 30 1/4)
0 голосов
/ 29 марта 2020

В обычном лиспе можно использовать mapcan, то есть append-map в Racket. Результаты, возвращаемые функцией, переданной append-map, должны возвращать список или '().

(define (changeList lst)
  (append-map (lambda (x)
                (cond ((> x 1) (list (* x 10)))
                      ((< x -1) (list (* (/ 1 x) -1)))
                      (else '())))
              lst))

Всегда, если вы хотите использовать map, но иногда не нужно собирать результаты, вы можете используйте append-map и используйте '() в качестве возвращаемого значения везде, где ничего не должно быть собрано.

...