Я продолжаю изучать Ракет (ну, в данном случае, функциональное программирование).
Я должен реализовать этот цикл функциональным способом программирования:
В данный момент у меня есть этот код:
#lang racket
(define EGS0
(lambda (PSET NSET CSET HSET)
(map (lambda (h)
(cond
[(not (andmap (lambda (p) (my-function h p)) PSET)) h]
[(not (ormap (lambda (n) (my-function h n)) NSET)) h]
) HSET))))
Вместо того, чтобы удалять элементы из списка HSET
, я создаю новый с элементами, которые мне не нужно удалять.Этот код является только в первом приближении : в некоторых случаях это добавит дважды h
, но это не моя проблема сейчас.
CSET
- пустой список и my-function
возвращает#t
или #f
.
Моя проблема связана с последним утверждением:
Затем удалите H из HSET и добавьте H в CSET.
С map
и я могу получить один список, но я не знаю, как получить два списка.я могу думать только о том, чтобы использовать set!
, но если я его использую, это не будет функциональная программа.
Вместо карты я подумал использовать цикл for
,или, может быть, сделать два цикла.
Как я могу получить два списка (новый список с элементами HSET и список CSET)?
ОБНОВЛЕНИЕ: Я добавляю некоторые данные для проверки алгоритма (кому-то нужна дополнительная помощь для понимания псевдокода).
(define my-function (lambda (x y) (and x y)))
(define hset '(1))
(define pset '(0))
(define nset '(1))
(egs pset nset '() hset)
Он должен возвращать: '(() (1))
.