为了账号安全,请及时绑定邮箱和手机立即绑定

为什么lisp里面反转一个列表里面的值?递归实现有问题啊?

为什么lisp里面反转一个列表里面的值?递归实现有问题啊?

MM们 2023-04-18 19:15:43
这个是我的代码:(defun reverse-list2 (list)   (if (null list) nil     (cons (reverse-list2 (rest list)) (first list))))我想反转,一个字符串列表。比如(reverse-list2 '("tar" "tip" "net"))希望是("net" "tip" "tar") 这样。结果是:(((NIL . "net") . "tip") . "tar")然后我把代码这样:(defun reverse-list2 (list)   (if (null list) nil     (cons (first list) (reverse-list2 (rest list)))))然后就正常输出,顺序的列表了。这个不理解啊。
查看完整描述

2 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

可以参考我的

(defun my-reverse (lst)
  (labels ((nxt (lst rst)
                (if (null lst)
                  rst
                  (nxt (cdr lst) (cons (car lst) rst)))))
    (nxt lst nil)))

需要注意的是cons是把一个element给cons到一个list前面,你这里的用法是有问题的。


查看完整回答
反对 回复 2023-04-21
?
烙印99

TA贡献1829条经验 获得超13个赞

我的解法。首先定義一個 (rcar) 算子,取列表的最後一項。然後定義一個 (rcdr) 算子,取列表除最後一項的其餘項。這兩個算子同 (car) 與 (cdr) 是對稱的。然後使用 (rcar) 與 (rcdr) 定義 (reverse) 算子。(rcar) 和 (rcdr) 兩個算子在其他的地方也可以用到。

(def rcar (lambda [L] (cond
    [(eq (cdr L) []) (car L)]
    [#true (*lambda* (cdr L))]
)))

(def rcdr (lambda [L] (cond
    [(eq (cdr L) []) []]
    [#true (cons (car L) (*lambda* (cdr L)))]
)))

(def reverse (lambda [L] (cond
    [(eq L []) L]
    [#true (cons (rcar L) (*lambda* (rcdr L)))]
)))


查看完整回答
反对 回复 2023-04-21
  • 2 回答
  • 0 关注
  • 94 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信