【问题标题】:LISP: Reversing a List in LISP using RPLACA/RPLACD/NCONCLISP:使用 RPLACA/RPLACD/NCONC 反转 LISP 中的列表
【发布时间】:2015-04-17 17:45:25
【问题描述】:

所以我试图让一个函数接收一个列表并将其反转,但我不确定如何使用RPLACA/RPLACD/NONC。基本上与 reverse 做同样的事情,但它使用原始列表的 cons 节点并且不分配任何新的 cons 节点。到目前为止我所拥有的是

(defun rip(lst)
(cond   (( null lst) 0)
    ((eq (nil) (cdr (last lst))) 1)
    (((setq x (car (last lst)))
     (rplaca (car (last lst)) (car first lst))
     (rplaca (car first lst) x)) + 2 rip(butlast(rest lst)))))

【问题讨论】:

  • 欢迎来到stackoverflow。听起来您已经尝试过自己编写一些代码。您应该在问题中包含它,即使它不完整。它为我们提供了一个起点,并表明您做出了努力。
  • 到目前为止,我没有使用任何必需的功能。 (defun reverse-in-place (l) (let ((result l)) (recurse reving ((ll) (r (reverse l)) (cond ((not (consp l)) result) (else (setf (car l) (car r)) (reving (cdr l) (cdr r))))))))
  • @John 你确定你使用的是 Common Lisp 吗?我认为recursereving 都不是语言中的东西。
  • 对不起,我添加了错误的标签
  • @zck:RECURSE 是一个宏,例如在 Lisp Land of Lisp 一书中使用。那么 REVING 就是这里的代码 sn-p 中引入的名称。

标签: lisp land-of-lisp


【解决方案1】:

所以我相信这就是他们正在寻找的答案:

Recursive: 
(define rip (lst)
(if (null lst) nil (nconc (rip (rest lst))(rplacd lst nil))))

Non-Recursive:
(defun rip (lst)
(do ((res nil) (todo (rest lst)(rest lst)))
    ((null lst) res)
  (setf res (rplacd lst res))
  (setf lst todo) ))

【讨论】:

    【解决方案2】:

    所以一个潜在的列表参数是(1 2)。我们可以想象参数是地址为#A 的列表,它看起来像这样:

    #A=(1 . #B)
    #B=(2 . nil) 
    

    对于每个缺点,我们在将 cdr 设置为前一个 cons 之前创建存储 cdr 的局部变量,第一个 cons 为 nil。当当前的consnil 时,你就完成了,结果是之前的cons。我们示例的结果是:

    #A=(1 . nil)
    #B=(2 . #A) 
    

    您需要的唯一变异函数是rplacd,因为唯一改变的是cdr。该函数可能如下所示:

    (defun nreverse (list)
      (labels ((aux (list prev)
                 (if (endp list)
                     <??>
                     (let ((next <??>))
                       (rplacd <??> <??>)
                       (aux <??> <??>)))))
        (aux list nil)))
    

    或者如果你不介意泄露,你可以这样做:

    (defun nreverse (list &optional prev)
      (if (endp list)
          <??>
          (let ((next <??>))
            (rplacd <??> <??>)
            (nreverse <??> <??>))))
    

    【讨论】:

      猜你喜欢
      • 2020-12-18
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      相关资源
      最近更新 更多