【问题标题】:Adding an element to a list in Scheme在 Scheme 中将元素添加到列表中
【发布时间】:2010-03-29 23:11:14
【问题描述】:

我正在使用 R5RS 方案,我只想实现一个返回两个给定列表的交集的函数,但我不能这样做,因为我无法将元素添加到列表中。这是我的代码。我该如何解决?我真的是 Scheme 的初学者——这是我第一次使用 Scheme。

提前谢谢..

(define list3 '())
(define (E7 list1 list2)

        (cond
          ((null? list1)
          list3)
          ((member (car list1) list2) (append list3 (list (car list1))))

        )
  (cond
          ((null? list1)
          list3)
          ((not(null? list1)) (E7 (cdr list1) list2)

        )

     )


)
(E7 '(4 5) '(3 4))

【问题讨论】:

  • 看起来更像 Scheme 而不是 Lisp。

标签: list lisp scheme


【解决方案1】:

这是一个递归版本,它执行交集而不是并集。

(define (intersect list1 list2)
  (cond ((null? list1)   list1)
        ((member (car list1) list2)   (cons (car list1) (intersect (cdr list1) list2)))
        (t   (intersect (cdr list1) list2))))

【讨论】:

    【解决方案2】:

    我想我看到了你的问题。有两种方法可以将元素添加到列表中。

    第一种方法是实际添加它:

    (define (intersect list1 list2)
      (define newlist list2)
      (do ((iter1 list1 (cdr iter1)))
        (not (null? iter1))
        (if (not (member (car iter1) newlist))
            (set! newlist (cons (car iter1) newlist)))))
    

    (如果你真的想使用它,你可能需要查找do 的定义。)

    您可能会注意到这很丑陋。那是因为实际上没有人这样做。相反,您必须意识到调用函数也会创建一个新变量。试试这个:

    (define (intersect list1 list2)
      (cond ((null? list1) list2)
            ((member (car list1) list2) (intersect (cdr list1) list2))
            (else (intersect (cdr list1) (cons (car list1) list2)))))
    

    如果您熟悉算法,您会注意到我刚刚编写的代码很慢,但它说明了这一点:在每种情况下,您都会做一些工作,然后再次调用您的函数。如果您无法理解其工作原理,请在您的示例中运行此函数:

    (define (intersect list1 list2)
      (display list1) (display " ") (display list2) (newline)
      (cond ((null? list1) list2)
            ((member (car list1) list2) (intersect (cdr list1) list2))
            (else (intersect (cdr list1) (cons (car list1) list2)))))
    

    【讨论】:

    • 非常感谢,但您似乎这样做是为了获得两个列表的并集,但我想取列表的交集。
    • 哦,开枪。你是对的。这将找到工会。不过,交集函数应该是相似的 - 只需以 '() 而不是 list2 作为您的工作列表开始。 (您可能需要向函数添加第三个参数。)
    【解决方案3】:

    这里有一些简单的省略号:

    (defun is (l1 l2)
      (let ((rtn))
        (mapc
          (lambda (e) 
            (if (member e l1)
              (push e rtn)))
          l2)
        rtn))
    

    这与这些简单测试的内置交集的行为相同:

    (is '(1 2 5) '(1 4 10 5))  => (5 1)
    (intersection '(1 2 5) '(1 4 10 5)) => (5 1)
    
    (is '(1 4 10 5) '(1 2 5)) => (5 1)
    (intersection '(1 4 10 5) '(1 2 5)) => (5 1)
    

    【讨论】:

    • 无法执行该代码。我应该怎么做才能在 drscheme 中运行它:s thx btw
    • 抱歉,不确定,我对 drscheme 不熟悉。正如我所说,这是 elisp。光看你的代码,是不是非得用“define”代替“defun”?
    • 是的,实际上 defun 对我不起作用,我不知道如何使用 defun
    • 示例代码在 Emacs Lisp 中。它与 Scheme 有很多共同点,看起来非常相似,但它是一种不同的语言。
    【解决方案4】:

    你最好使用来自 srfi-1 的set operations

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-31
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多