如何使用Scheme将列表的第一个元素移动到列表的末尾?

时间:2012-10-06 02:23:50

标签: list recursion scheme append

我一直在查看这个,我可以在列表的末尾添加“东西”,但我到达的问题是,特别是列表的第一个元素添加到同一个列表的末尾

例如:

{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)))])) 

这段代码的问题是,对于空?条件,答案调用(第一个),但由于它是递归的,因此该列表的第一个元素为空。由于方案是动态类型的,我不能将第一个元素存储在任何地方(至少我认为我不能)。

如何仅使用基本列表功能来实现此功能? (例如,缺点,缺点?,空?先,最后,休息)

2 个答案:

答案 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就需要采取行动了......