【问题标题】:Recursively append the first element of the list to the rest of a list递归地将列表的第一个元素附加到列表的其余部分
【发布时间】:2013-06-22 22:37:16
【问题描述】:

我对方案很陌生,我想获取一个诸如 (1 2 3 4) 之类的列表并将其发送到将返回 (4 1 2 3) 的函数。第二次运行将返回 (3 4 1 2),依此类推,每次调用该函数时都会创建一个右移列表。

我想出解决这个问题的第一种方法是递归地交换列表的第一个和最后一个值。因此,在方案中,我会将列表的 car 附加到列表的 cdr 中,并将列表的 cdr 递归地发送回我的函数,直到只能进行最后一次交换。

但是,我不擅长创建递归函数,而且我在使用新语言(例如 scheme)时遇到了麻烦。这是我到目前为止所尝试的,以说明我想去哪里。

(define (rShift lst)
  (if (null? lst)
      '()
      (append (cdr lst (car lst))(rShift (cdr lst)))))

【问题讨论】:

  • 您没有测试代码。 (cdr lst (car lst)) 部分甚至无法编译。

标签: list recursion scheme shift


【解决方案1】:

您可以做的最好的事情是查看您的解释器的文档以了解可用的列表函数,并使用它们构建解决方案。例如,在 Racket 中使用list procedures 将完成一个简单的解决方案:

(define (rShift lst)
  (cons                             ; stick together the solution
   (last lst)                       ; pick the last item
   (take lst (sub1 (length lst))))) ; pick all items except the last one

让我们试一试:

(rShift '(1 2 3 4))
=> '(4 1 2 3)

(rShift (rShift '(1 2 3 4)))
=> '(3 4 1 2)

有无数种方法可以解决这个问题,我会让您找到最适合您需求的方法,但请记住 - 始终尝试根据您已经掌握的构建块来解决问题,并且不要重新发明轮子。只是为了好玩,这是另一种方式,使用reverse

(define (rShift lst)
  (let ((rev (reverse lst)))
    (cons (car rev)
          (reverse (cdr rev)))))

【讨论】:

  • 谢谢,随着我了解更多已经内置的功能方案,它变得更容易了。
【解决方案2】:

如果您打算执行递归解决方案,那么您需要问自己“问题的哪一部分可以解决,留下相同但较小的问题部分”以及“我如何结束递归”。

对于您的问题,当您拥有最后一个元素时结束递归,然后您可以使用该元素将其添加到列表的前面。问题是使用“右移”进行递归是不够的,因为您需要保留列表以便将最后一个元素放在其前面。

所以:

(define (right-shift list)
  (if (null? list)
      '()
      (let shifting ((list list) (result '()))
        (if (null? (cdr list))
            (cons (car list) (reverse result))
            (shifting (cdr list) (cons (car list) result))))))
;; Hey look, it compiles... gosh I love interactive languages.

;; ... and works.
> (right-shift '(1 2 3 4))
(4 1 2 3)
> (right-shift (right-shift '(1 2 3 4)))
(3 4 1 2)

【讨论】:

  • 在单一命名空间中调用参数 list 不是一个好习惯。
  • 或者它是Scheme之美的一部分。当一个人了解词汇环境时;一个人什么都懂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
  • 2016-01-25
  • 1970-01-01
  • 2012-10-26
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多