为什么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)))))

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


MM们
浏览 95回答 2
2回答

慕侠2389804

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

烙印99

我的解法。首先定義一個 (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)))] )))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java