【问题标题】:Combine two lists into one list Racket将两个列表合并为一个列表 Racket
【发布时间】:2015-04-01 07:49:28
【问题描述】:

我有一个问题:

我有两个数字列表,例如 (list1 3 6 7) 和 (list2 1 6 4 7)。现在我必须将两者结合到(list3 1 3 4)中。所以 6 和 7 都在 list1 和 list2 中。 List3 包含所有仅出现一次的数字。如果不只是问我,我希望你明白我的意思:s! 这是我的开始:

(define (diff list1 list2)
  (cond
    [(empty? list1) list2] ;; If list1 was empty return directly list2
    [(empty? list2) list1] ;; If list2 was empty return directly list1
    [else
      (???

我知道我必须将第一个 list1 与 list2 中的每个数字进行比较,然后再次递归。但是我该如何编程呢?

【问题讨论】:

    标签: list recursion compare racket


    【解决方案1】:

    这是一个不同的、希望不那么棘手的实现。 (它是 O(n),但它需要对两个传入列表进行排序;相比之下,Óscar 的实现不需要排序列表,但它是 O(n²)。)

    (define (diff lhs rhs)
      (let loop ((result '())
                 (lhs lhs)
                 (rhs rhs))
        (cond ((null? lhs) (append-reverse result rhs))
              ((null? rhs) (append-reverse result lhs))
              (else (let ((a (car lhs))
                          (b (car rhs)))
                      (cond ((< a b) (loop (cons a result) (cdr lhs) rhs))
                            ((< b a) (loop (cons b result) lhs (cdr rhs)))
                            (else (loop result (cdr lhs) (cdr rhs)))))))))
    

    例子:

    > (diff '(3 6 7) '(1 4 6 7))
    (1 3 4)
    

    append-reverse 来自SRFI 1,因此在 Racket 中您必须使用 (require srfi/1)

    【讨论】:

    • s/ordered/sorted/ ;)
    • 嘿,很好,但我们从未使用过关键字“car”或“loop”,所以我认为我不能使用这个:(但真的感谢你的帮助:)!
    • @Tobias 我几乎总是以专业 Schemer 编码的方式回答问题,而不是“家庭作业批准”的方式。但是,car 在您的课程中可能拼写为 first
    猜你喜欢
    • 2014-01-27
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2021-04-04
    • 2019-02-05
    • 1970-01-01
    相关资源
    最近更新 更多