【问题标题】:Moving first element moved to the end of the list - Scheme将第一个元素移动到列表的末尾 - 方案
【发布时间】:2011-12-19 13:39:33
【问题描述】:

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

正确的结果:

(first_to_last '(1 2 3))

(2 3 1)

(从头到尾(从头到尾'(1 2 3)))

(3 1 2)

【问题讨论】:

  • (reverse(cdr(reverse(cdr(reverse b))))) 允许我从列表中删除第一个和最后一个元素,但我不知道如何移动元素到正确的位置。

标签: scheme


【解决方案1】:

就个人而言,我认为您在倒车方面做得过火了。

我们想要的是一个由cdr xcar x 附加到末尾的列表。这里的一个技巧是car x 不是一个列表,所以我们想在附加它之前将它转换为一个列表:

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

如果您想坚持基本原则,cons 是将事物组合到列表中的真正基本方法,但它需要更多的工作。您基本上最终会定义与append 基本相同的cons。考虑到append 已经存在,这很简单,但毫无意义。

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

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

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

【讨论】:

  • 谢谢。这更有意义。因此,如果我想做与此相反的操作(将最后一个元素移动到第一个元素),我只想执行相同的过程但使用最后一个函数?
  • @user1023900:是的,这听起来很对。在这里,倒车可能是有意义的:last-to-first, is (reverse(first-to-last(reverse x)))。这可能不是最有效的工作方式,但它非常简单。
  • 渐近地,一个反向与两个反向没有任何不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 2023-03-17
  • 2012-09-25
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
相关资源
最近更新 更多