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

时间:2020-06-30 03:45:02

标签: scheme lisp racket

我试图用尾递归编写一个Racket函数,它应该返回倒排的列表,但是最后一个元素应该保留在最后一个位置。

也就是说,我需要从示例中获取信息:

(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)

1 个答案:

答案 0 :(得分:1)

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

(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)
相关问题