Логическая проверка, является ли определенный элемент частью отфильтрованного списка в схеме - PullRequest
0 голосов
/ 04 октября 2019

Я работаю со Схемой и хочу сделать несколько простых программ. Я создал один, в котором кратные пять отфильтрованы из списка. Теперь я хочу написать булеву функцию, в которой она сообщит мне, является ли определенный элемент частью отфильтрованного списка! Поэтому, если я напишу «8», он скажет «ложь», а «40» - «истина». Спасибо!

(define (multiple-of-5 some-integer)
  (equal? (remainder some-integer 5) 0))

(filter multiple-of-5 '(2 5 8 20 25 27 32 40))

вывод пока:

(5 20 25 40)

Ответы [ 2 ]

0 голосов
/ 05 октября 2019

Как вы составили список (5 20 25 40) не имеет значения. Таким образом, весь ваш код не имеет отношения к этому вопросу. По сути, вам нужно следующее:

(define some-list '(5 20 25 40)) ; doesn't matter how this came about
(find (lambda (e) (= e 8)) some-list) ; ==> #f
(find (lambda (e) (= e 40)) some-list) ; ==> 40 (thruthy)

Теперь find определено в библиотеке списков SRFI-1 и признано за R7RS Large. Я полагаю, что вы могли бы сделать абстракцию более полезной для вашего случая, например (exists? 40 some-list), которая использует find, или вы можете свернуть свою собственную, как в ответе Торбио.

0 голосов
/ 04 октября 2019

Вы можете реализовать рекурсивную функцию contains?, которая перемещается по списку и проверяет, равен ли введенный номер текущему элементу списка. Условие для остановки - если список пуст или содержит номер. Довольно понятно.

(define (contains? l i)
  (if (null? l) #f
      (or (equal? (car l) i) (contains? (cdr l) i))))

(contains? (filter multiple-of-5 '(2 5 8 20 25 27 32 40)) 8)  ; #f
(contains? (filter multiple-of-5 '(2 5 8 20 25 27 32 40)) 40) ; #t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...