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

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

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

萧十郎 2019-04-23 15:35:30
这个是我的代码:(defunreverse-list2(list)(if(nulllist)nil(cons(reverse-list2(restlist))(firstlist))))我想反转,一个字符串列表。比如(reverse-list2'("tar""tip""net"))希望是("net""tip""tar")这样。结果是:(((NIL."net")."tip")."tar")然后我把代码这样:(defunreverse-list2(list)(if(nulllist)nil(cons(firstlist)(reverse-list2(restlist)))))然后就正常输出,顺序的列表了。这个不理解啊。
查看完整描述

2 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

可以参考我的(defunmy-reverse(lst)
(labels((nxt(lstrst)
(if(nulllst)
rst
(nxt(cdrlst)(cons(carlst)rst)))))
(nxtlstnil)))需要注意的是cons是把一个element给cons到一个list前面,你这里的用法是有问题的。
                            
查看完整回答
反对 回复 2019-04-23
?
ITMISS

TA贡献1871条经验 获得超8个赞

我的解法。首先定義一個(rcar)算子,取列表的最後一項。然後定義一個(rcdr)算子,取列表除最後一項的其餘項。這兩個算子同(car)與(cdr)是對稱的。然後使用(rcar)與(rcdr)定義(reverse)算子。(rcar)和(rcdr)兩個算子在其他的地方也可以用到。
(defrcar(lambda[L](cond
[(eq(cdrL)[])(carL)]
[#true(*lambda*(cdrL))]
)))
(defrcdr(lambda[L](cond
[(eq(cdrL)[])[]]
[#true(cons(carL)(*lambda*(cdrL)))]
)))
(defreverse(lambda[L](cond
[(eqL[])L]
[#true(cons(rcarL)(*lambda*(rcdrL)))]
)))
                            
查看完整回答
反对 回复 2019-04-23
  • 2 回答
  • 0 关注
  • 374 浏览
慕课专栏
更多

添加回答

举报

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