List 在带有限制的方案中反转列表

List 在带有限制的方案中反转列表,list,scheme,racket,reverse,restriction,List,Scheme,Racket,Reverse,Restriction,我已经有了反转列表的代码: (define (myreverse lst) (if (null? lst) lst (append (reverse (cdr lst)) (list (car lst))))) 但我只想使用electrec、cons、car和cdr来实现这一点。如何才能做到这一点?在不使用append的情况下反转列表的标准方法是使用helper函数REVAPPEND,如下所示:

我已经有了反转列表的代码:

    (define (myreverse lst)
       (if (null? lst)
          lst
          (append (reverse (cdr lst))
                  (list (car lst)))))

但我只想使用
electrec
cons
car
cdr
来实现这一点。如何才能做到这一点?

在不使用append的情况下反转列表的标准方法是使用helper函数REVAPPEND,如下所示:

(define (reverse x) (revappend x '()))
(define (revappend x y)
  (if (null? x)
      y
      (revappend (cdr x) (cons (car x) y))))
现在,如果您想将reverse实现为单个函数,那么可以使用LETREC在本地定义REVAPPEND助手,如下所示

(define (reverse x)
  (let revappend ((x x) (y '()))
    ...))

这只是一个模板,您可以随时询问是否需要更多帮助。

在不使用append的情况下反转列表的标准方法是使用helper函数REVAPPEND,如下所示:

(define (reverse x) (revappend x '()))
(define (revappend x y)
  (if (null? x)
      y
      (revappend (cdr x) (cons (car x) y))))
现在,如果您想将reverse实现为单个函数,那么可以使用LETREC在本地定义REVAPPEND助手,如下所示

(define (reverse x)
  (let revappend ((x x) (y '()))
    ...))

这只是一个让你开始的模板,请随意询问你是否需要更多帮助。

你(除了
定义的
本身编码的模板之外,实际上)。只包括那些,不包括
if
null?
,或
append
?@AlexKnauth不
append
,我想你是对的,另外两个是无法避免的。您的初始代码中有一个bug。应该使用
myreverse
而不是
reverse
。现在是怎样的您只需将第一个elemenet添加到最后一个,并使用不同的过程来完成列表的其余部分的反转。仅使用命名过程是完全不可能的。您(除了定义本身编码的过程之外)只需要那些,不包括
if
null?
,或者
append
?@AlexKnauth不
append
我想,但是你是对的,其他两个是不可避免的。你的初始代码中有一个bug。应该使用
myreverse
而不是
reverse
。现在的情况是,您只需将第一个elemenet添加到最后一个,并使用不同的过程来执行列表的其余部分反转。仅使用命名过程是完全不可能的。