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

这个是我的代码:

(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)))))

然后就正常输出,顺序的列表了。
这个不理解啊。

阅读 4.7k
2 个回答

可以参考我的

(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前面,你这里的用法是有问题的。

新手上路,请多包涵

我的解法。首先定義一個 (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)))]
)))
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏