Получить два разных списка с картой - PullRequest
0 голосов
/ 27 февраля 2019

Я продолжаю изучать Ракет (ну, в данном случае, функциональное программирование).

Я должен реализовать этот цикл функциональным способом программирования: enter image description here

В данный момент у меня есть этот код:

#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)).

1 Ответ

0 голосов
/ 27 февраля 2019

Обратите внимание, что эта проблема носит процедурный характер и не так просто написать в функциональном стиле;в этом случае запись явного цикла более естественна, чем использование map или filter.

. Вернуть два значения легко, это можно сделать, передав два параметра аккумулятора в рекурсии и вернув их в концевнутри списка.Вот моя реализация:

(define (egs pset nset cset hset)
  (let loop ((input hset) (output '()) (cset cset))
    (if (null? input)
        ; return modified cset and hset
        (list cset output)
        (let ((pset-match
               (andmap (lambda (p) (my-function (car input) p)) pset))
              (nset-match
               (ormap (lambda (n) (my-function (car input) n)) nset)))
          (cond ((not nset-match)
                 ; if h does not match any members from nset
                 ; remove h from hset, add h to cset
                 (loop (cdr input) output (cons (car input) cset)))
                ((not pset-match)
                 ; if h does not match all members of pset
                 ; remove h from hset, leave cset unmodified
                 (loop (cdr input) output cset))
                (else
                 ; otherwise don't remove h from hset, leave cset unmodified
                 (loop (cdr input) (cons (car input) output) cset)))))))

Работает с примером ввода:

(define my-function (lambda (x y) (and x y)))

(define hset '(1))
(define pset '(0))
(define nset '(1))

(egs pset nset '() hset)
=> '(() (1))
...