代码之家  ›  专栏  ›  技术社区  ›  VansFannel

用地图得到两个不同的列表

  •  0
  • VansFannel  · 技术社区  · 5 年前

    我在继续学习Racket(在本例中是函数式编程)。

    我必须用函数编程的方式实现这个循环: 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 .

    我的问题是最后一句话:

    然后从HSET中移除H并将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)) .

    0 回复  |  直到 5 年前
        1
  •  1
  •   Óscar López    5 年前

    请注意,这个问题本质上是过程性的,并不像函数式那样直接编写;在这种情况下,编写显式循环比使用 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))