Scheme 移动第一个元素移动到列表的末尾-方案

Scheme 移动第一个元素移动到列表的末尾-方案,scheme,Scheme,我在编写一个函数时遇到问题,该函数每次调用时都会将第一个元素移动到列表的末尾。我曾尝试使用reverse和cdr的组合来切断两端的元素,但不知道如何将元素添加到正确的一端。任何帮助都将不胜感激。谢谢 正确的结果: (从第一个到最后一个(1 2 3)) (2 3 1) (从第一到最后(从第一到最后)(1 2 3))) (3 1 2)就个人而言,我认为你的倒车做得太过分了 我们需要的是一个由cdr x和car x组成的列表。这里的一个技巧是,car x不是一个列表,因此我们希望在附加它之前将其转换为

我在编写一个函数时遇到问题,该函数每次调用时都会将第一个元素移动到列表的末尾。我曾尝试使用reverse和cdr的组合来切断两端的元素,但不知道如何将元素添加到正确的一端。任何帮助都将不胜感激。谢谢

正确的结果:

(从第一个到最后一个(1 2 3))

(2 3 1)

(从第一到最后(从第一到最后)(1 2 3)))


(3 1 2)

就个人而言,我认为你的倒车做得太过分了

我们需要的是一个由
cdr x
car x
组成的列表。这里的一个技巧是,
car x
不是一个列表,因此我们希望在附加它之前将其转换为一个列表:

(define (first-to-last x) (append (cdr x) (list (car x))))
如果你想坚持基本原则,
cons
确实是将事物组合到列表中的基本方法,但这需要更多的工作。基本上,您最终定义的内容与
append
cons
方面基本相同。这很容易,但有点毫无意义,因为
append
已经存在

编辑:我想如果出于某种原因想使用
反向
,可以这样做:

(define (first-to-last x) (reverse (cons (car x) (reverse (cdr x)))))

它有点长,让我觉得有点笨拙,但无论如何它应该能工作。

(reverse(cdr(reverse)(cdr(reverse bщщщ)))允许我从列表中删除第一个和最后一个元素,但我不知道如何将元素移动到正确的位置。谢谢。这更有意义。因此,如果我想做与此相反的事情(将最后一个元素移到第一个元素),我只想做相同的过程,但使用最后一个函数?@user1023900:是的,听起来不错。在这里,反转可能是有意义的:从最后到第一,是(反转(从第一到最后(反转x)))。这可能不是最有效的方法,但它确实很简单。渐进地说,一个反转和两个反转没有任何区别。