亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么lisp里面反轉一個列表里面的值?遞歸實現有問題?。?/h1>

為什么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 關注
  • 125 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號