0

我一直在研究这个,我可以在列表的末尾添加“一些东西”,但我遇到的问题是将列表的第一个元素添加到同一个列表的末尾。

例如:

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

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

我怎样才能让它工作,只使用基本的列表功能?(例如,缺点,缺点?,空?第一个,最后一个,休息)

4

2 回答 2

2

你可以使用闭包来存储你想要的任何东西。

这是我写的解决方案,删除了一些细节,给你一些思考的空间。:-)

(define (copy-first-to-end lst)
  (define top ???)
  (define (inner lst)
    (if (null? lst) ???
        (cons ??? (inner ???))))
  (inner ???))

在这种情况下,inner是一个闭包,除其他外,它可以访问top变量(您将使用它来存储您感兴趣的值)。

于 2012-10-06T06:58:17.523 回答
1

因此,您实际上是在尝试编写自己的append函数实现,在特殊情况下,您将附加一个包含列表中第一个 s 表达式的列表。您的问题是您不能将平面列表转换为平面列表并因此获得单个平面列表。使用 cons 执行此操作的唯一方法是将第一个列表分解为其组成的 s 表达式,然后将它们以相反的顺序 cons 到第二个列表中。递归应该使这成为一项简单的任务。

(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 表达式所需的操作是显而易见的......

于 2012-10-06T09:52:20.910 回答