2011-11-01 184 views
2

我无法编写将第一元素移动到每次调用的时间列表的最后一个功能。我已经尝试使用reverse和cdr的组合来切断两端的元素,但无法弄清楚如何将元素添加到正确的末尾。任何帮助,将不胜感激。谢谢!移动第一个元素移到列表的末尾 - 计划

正确结果:

(first_to_last '(1 2 3))

(2 3 1)

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

(3 1 2)

+0

(反向(CDR(反向(CDR(反向B)))))让我删除第一个和最后一个元素关闭名单的,但我不知道如何去的元素移动到正确的地方。 – user1023900

回答

1

我觉得你过这样的逆转,个人。

我们要的是一个由cdr xcar x追加到末尾的列表。这里的一个诀窍是,car x不是一个列表,所以我们想把它转换到一个列表追加前:

(define (first-to-last x) (append (cdr x) (list (car x)))) 

如果你想抓住根本,cons是把真正的根本途径事情一起列入清单,但它会多一点工作。你会基本结束了定义中的cons方面的东西append基本相同。这很容易,但有点毫无意义,因为append已经存在。

编辑:我想,如果你想使用reverse出于某种原因或其他,你可以做这样的事情:

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

这是一个有点长,在我看来是一种笨拙,但它应该反正工作。

+0

谢谢。这使得更有意义。所以,如果我想要做的这种相反的(移动到第一个最后一个元素),我只想做同样的过程,但使用的最后一个函数? – user1023900

+0

@ user1023900:是的,这听起来是正确的。在这里,倒序可能是有意义的:倒数第一,是(倒数(倒数第一(倒数x)))。这可能不是最有效率的方式来完成这项工作,但它是一个非常简单的方法。 –

+0

渐近地说,一个反转与两个反转没有任何区别。 –

相关问题