方案附加程序
我在将一个列表附加到另一个列表时遇到问题。下面是我的代码。当我运行 (append '(1 2) '(3 4)) 时,我得到 '(1 3 2 4)。
我希望输出为 '(1 2 3 4)
(define (append l m)
(if (null? l) '()
(cons (car l) (append m (cdr l)))))
谢谢
I'm having trouble appending a list to another list. Below is my code. When I run (append '(1 2) '(3 4)) I get '(1 3 2 4).
I want the output to be '(1 2 3 4)
(define (append l m)
(if (null? l) '()
(cons (car l) (append m (cdr l)))))
Thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
好吧,通过像这样切换两个列表(递归调用追加时切换 m 和 l 的位置),您将获得第一个列表的第一项,然后是第二个列表的第一项,依此类推。
如果您不这样做如果想要这样,您应该将 l 作为第一个参数,将
m
作为第二个参数。所以你会得到:当然这也不能按预期工作,因为现在你只得到第一个列表,并且根本没有附加任何内容。您需要做的是,一旦第一个列表完全附加(即一旦
l
为空),您需要返回第二个列表作为尾部,如下所示:Well by switching the two lists around like that (switching the position of m and l when calling append recursively), you'll get the first item of the first list followed by the first item of the second list etc.
If you don't want that, you should keep l as the first argument and
m
as the second. So you get:Of course this doesn't work as wanted either, because now you only get the first list back and nothing is appended at all. What you need to do is, once the first list is fully appended (i.e. once
l
is empty), you need to return the second one as the tail, like this:我在自学的时候发现了这个。 @sepp2k的答案是一条很好的指令,指导OP纠正他们的代码以实现append的递归定义。下面是使用高阶函数
foldr
的my-append
的替代定义:I came across this while studying myself. @sepp2k's answer is a fine piece of instruction guiding OP to correct their code to achieve a recursive definition of append. Here's an alternate definition of
my-append
using the higher-order functionfoldr
: