list - 在 Scheme 中将元素添加到列表的末尾
问题描述
负责添加到制作a
的末尾(b c)
(b c a)
到目前为止,当我尝试
(print (cons 'a '(b c)))
我明白了(a b c)
但是当我这样做时
(print (cons '(b c) 'a))
我明白了((b c) . a)
Stack 上的所有其他类似问题似乎都比这个问题更复杂,所以我想知道是否有一个简单的解决方法。
解决方案
列表是一对链。元素是每对的汽车,cdr 是对链中下一对的引用,或者是链中最后一对的空列表。
当您使用时,(cons 'a '(b c))
您在现有列表前面创建一个新对(b c)
,因此结果仍然是一个列表。
但是当你使用 时(cons '(b c) 'a)
,你正在创建一个 cdr 是符号的对a
,而不是一个列表。并且列表中的最后一对(b c)
仍然有它的 cdr 指向空列表。
您需要复制第一个列表,当您到达末尾时,您必须使 cdr 指向包含a
. 您可以使用递归过程来做到这一点。
(define (list-append old-list new-el)
(if (null? old-list)
(list new-el)
(cons (car old-list)
(list-append (cdr old-list) new-el))))
(list-append '(b c) 'a)
逻辑是:
- 如果我们尝试追加到一个空列表,只需返回一个包含新元素的列表
- 否则,使用递归调用将新元素附加到原始列表的尾部,然后将第一个元素放在其前面(使用
(cons new-element old-list)
您在第一个示例中显示的方法)。
推荐阅读
- firebase - 配置根项目“firebase_auth”时出现问题
- python - 用python中的搭配字典替换文本文件中的所有搭配
- x86 - MASM v6.11 - 准备就绪时敲击键
- python - 如何让我的 python 脚本在我的 GPU 上运行
- java - 扩展类对象java的ID自动递增
- javascript - 叶节点细胞景观的不同行为
- version-control - 有没有办法在 Mercurial 中恢复到早期版本的提交?
- html - 如何在固定 div 之后定位非固定 div?
- python - 得到一个像 TypeError: cannot unpack non-iterable float object 这样的错误
- python - GreedyAgent() 类的实例如何使用变量而不创建任何变量?