反转没有球拍中最后一个元素的列表

Invert a list without the last element in Racket

我正在尝试编写一个带有尾递归的 Racket 函数,它应该 return 倒排列表,但最后一个元素应该保留在最后一个位置。

也就是我需要从例子中得到:

(reversar-lista '(1 2 3 4))
>(3 2 1 4)

这是我目前的情况:

(define (reversar-lista lista)
(define (reversa-aux lista aux)
  (if (null? lista) aux
      (reversa-aux (cdr lista) (reverse (cons (car lista) aux)))
  )
 )
  (reversa-aux lista '())
 )

我得到以下输出:

(3 1 2 4)

仅使用内置程序即可解决此问题,无需实现显式循环逻辑:

(define (reversar-lista lista)
  (if (null? lista)
      '()
      (append (reverse (drop-right lista 1))
              (take-right lista 1))))

当然,也可以手动编写解决方案 - 但您必须小心处理边缘情况,尤其要注意空列表情况。

你的解决方案的主要问题是你必须在最后一个元素之前停止递归,并且你不能reverse每次迭代的结果,无论如何,列表正在反向构建。这就是我的意思:

(define (reversar-lista lista)
  (define (reversa-aux lista aux)
    (if (null? (cdr lista))
        (append aux (list (car lista)))
        (reversa-aux (cdr lista) (cons (car lista) aux))))
  (if (null? lista)
      '()
      (reversa-aux lista '())))

无论哪种方式,它都按预期工作:

(reversar-lista '())
=> '()
(reversar-lista '(1))
=> '(1)
(reversar-lista '(1 2))
=> '(1 2)
(reversar-lista '(1 2 3))
=> '(2 1 3)
(reversar-lista '(1 2 3 4))
=> '(3 2 1 4)