Scheme 反向列表方案

Scheme 反向列表方案,scheme,racket,Scheme,Racket,我正在尝试反转列表,以下是我的代码: (define (reverse list) (if (null? list) list (list (reverse (cdr list)) (car list)))) 所以,如果我输入(反转(1234)),我希望它显示为(43221),但现在它没有给我这个。我做错了什么?如何修复它?在列表上重复出现的自然方式并不是解决此问题的最佳方式。正如@lancery指出的公认答案中所建议的那样,使用append,也不是一个好主意-无论

我正在尝试反转列表,以下是我的代码:

(define (reverse list)
  (if (null? list) 
     list
      (list (reverse (cdr list)) (car list))))

所以,如果我输入(反转(1234)),我希望它显示为(43221),但现在它没有给我这个。我做错了什么?如何修复它?

在列表上重复出现的自然方式并不是解决此问题的最佳方式。正如@lancery指出的公认答案中所建议的那样,使用
append
,也不是一个好主意-无论如何,如果您在Scheme中学习自己的方法,最好是您自己尝试实现解决方案,我将向您展示该做什么,但首先是一个提示-不要使用
list
作为参数名称,这是一个内置过程,您将覆盖它。使用其他名称,例如,
lst

通过一个helper过程来反转一个列表更简单,它将每个元素的结果累加到结果的开头,这将产生反转列表的效果——顺便说一句,helper过程是尾部递归的。以下是总体思路,请填空:

(define (reverse lst)
  (<???> lst '()))                       ; call the helper procedure

(define (reverse-aux lst acc)
  (if <???>                              ; if the list is empty
      <???>                              ; return the accumulator
      (reverse-aux <???>                 ; advance the recursion over the list
                   (cons <???> <???>)))) ; cons current element with accumulator
(定义(反向lst)
(lst’());调用帮助程序
(定义(倒车辅助lst acc)
(如果;如果列表为空
;返回蓄能器
(反转aux;在列表上推进递归
(反对),;带蓄能器的电流元件

当然,在现实生活中,您不会从头开始实施
reverse
,这是一个内置的解决方案。

这里有一个使用
构建列表
过程的解决方案:

(define reverse
  (lambda (l)
    (let ((len (length l)))
      (build-list len
                  (lambda (i)
                    (list-ref l (- len i 1)))))))
(define (rev lst)
 (if (null? lst)
     '()
      (append (rev (cdr lst)) (car lst))))

还有一个类似奥斯卡的答案。我刚刚开始学习计划,所以如果您发现问题,请原谅:)。

此计划有效,但不是尾部递归过程:

(define reverse
  (lambda (l)
    (let ((len (length l)))
      (build-list len
                  (lambda (i)
                    (list-ref l (- len i 1)))))))
(define (rev lst)
 (if (null? lst)
     '()
      (append (rev (cdr lst)) (car lst))))

实际上,没有必要在身体上附加或填充一堆羊肉

(define (reverse items)
  (if (null? items)
      '()
      (cons (reverse (cdr items)) (car items))))

使用命名的
let
的尾部递归方法:

(define (reverse lst)
  (let loop ([lst lst] [lst-reversed '()])
    (if (empty? lst)
        lst-reversed
        (loop (rest lst) (cons (first lst) lst-reversed)))))

这基本上与在Oscar的回答中使用带有累加器参数的helper函数的方法相同,在这里,
let
之后的
循环
绑定使let成为一个可以调用的内部函数。

我认为最好使用append而不是cons

(define (myrev l)
  (if (null? l)
      '()
      (append (myrev (cdr l)) (list (car l)))
  )
)
这是另一个带有尾部递归的版本

(define (myrev2 l)
  (define (loop l acc) 
    (if (null? l)
        acc
        (loop (cdr l) (append (list (car l)) acc ))
    )
  )
  (loop l '())
)

下面是一个递归过程,它描述了在Scheme中反转列表的迭代过程(尾部递归)

(define (reverse lst)
  (define (go lst tail)
    (if (null? lst) tail
        (go (cdr lst) (cons (car lst) tail))))
  (go lst ())))
(define (reverse2 lst)
  (if (null? lst) ()
    (append (reverse2 (cdr lst)) (list (car lst)))))

(define (append l1 l2)
  (if (null? l1) l2
      (cons (car l1) (append (cdr l1) l2))))
使用替代模型(相反(列表1、2、3、4))


下面是一个递归过程,它描述了在Scheme中反转列表的递归过程(不是尾部递归)

(define (reverse lst)
  (define (go lst tail)
    (if (null? lst) tail
        (go (cdr lst) (cons (car lst) tail))))
  (go lst ())))
(define (reverse2 lst)
  (if (null? lst) ()
    (append (reverse2 (cdr lst)) (list (car lst)))))

(define (append l1 l2)
  (if (null? l1) l2
      (cons (car l1) (append (cdr l1) l2))))
使用替代模型(反向2(列表1 2 3 4))


尾部递归解决方案:

(define (reverse oldlist)
    (define (t-reverse oldlist newlist)
        (if (null? oldlist)
            newlist
            (t-reverse (cdr oldlist) (cons (car oldlist) newest))))
    (t-reverse oldlist '()))

您是否希望您的代码能够处理循环列表和不正确列表中的一个或两个?我不建议使用“list”作为参数名-Scheme的词法范围是其优点的一部分。我建议不要将参数与“全局”函数混为一谈;posers代码中的一个错误。我想你是指
append
而不是
cons
。运行
(reverse'(1233))
产生
((().3).2.1)
是的,你说得对@Salvatore Rapisarda说对了,这不是和年的第一个解决方案完全一样吗,直到变量重命名为止。:)是的,看起来是一样的