我一直在查看这个,我可以在列表的末尾添加“东西”,但我到达的问题是,特别是列表的第一个元素添加到同一个列表的末尾
例如:
{1,2,3,4}变为{1,2,3,4,1}。
以下是我遇到问题的代码:
(define (copy-first-to-end lst)
(cond [(empty? lst)
(cons (first lst) empty)]
[else (cons (first lst)
(copy-first-to-end (rest lst)))]))
这段代码的问题是,对于空?条件,答案调用(第一个),但由于它是递归的,因此该列表的第一个元素为空。由于方案是动态类型的,我不能将第一个元素存储在任何地方(至少我认为我不能)。
如何仅使用基本列表功能来实现此功能? (例如,缺点,缺点?,空?先,最后,休息)
答案 0 :(得分:2)
您可以使用闭包来存储您想要的任何内容。
这是我写的解决方案,删除了一些细节,为您提供一些思考空间。 : - )
(define (copy-first-to-end lst)
(define top ???)
(define (inner lst)
(if (null? lst) ???
(cons ??? (inner ???))))
(inner ???))
在这种情况下,inner
是一个闭包,除其他外,它可以访问top
变量(您将用它来存储您感兴趣的值)。
答案 1 :(得分:1)
因此,您实际上是在尝试编写自己的 append 函数的实现,特殊情况是您将附加一个包含列表中第一个s-expression的列表。您的问题是,您不能将平面列表整合到一个平面列表中,并因此获得单个平面列表。使用缺点执行此操作的唯一方法是将第一个列表分解为其组成的s表达式,然后将它们以相反的顺序将它们纳入第二个列表 。递归应该使这个任务变得简单。
(define (append-first-to-end lst)
(define (append-to-end a lst)
(if (null? (cdr lst)) ???
(cons ??? (append-to-end a ???))))
(append-to-end (car lst) lst))
在我的例子,克里斯的例子和我的开头段落之间,你应该能够填补空白。
我希望一旦你从lst获得最终的s-expression就需要采取行动了......