在O(n)中的球拍中的反向列表

时间:2015-02-16 22:12:57

标签: scheme lisp racket

我需要在Scheme中编写一个递归函数,它接受一个原子列表并在线性时间内反转它。我只允许使用define,lambda,cons,car,cdr,cond,let和null? 。以下是我到目前为止的情况:

(define reverse
  (lambda (lat)
    (cond
      ((null? lat) lat)
      (else (cons (reverse (cdr lat)) (cons (car lat) '()))))))

所以当我调用函数时:

(reverse '(a b c d))

我得到以下输出:

'(() (((() 4) 3) 2) 1)

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

问题是,如果(reverse (cdr lat))返回列表,例如(3 2),则(cons '(3 2) (1))会变为((3 2) 1)

执行此操作的一种经典方法是创建一个本地过程,它接受累加器以及全局过程的参数。当您从开头到结尾迭代列表时,您会从结尾到开头累积一个列表,使其与参数完全相反。当迭代列表为空时,您的答案在累加器中。当你注意到每个元素迭代一次,当你点击空列表时,你返回累加器它是一个完美的O(n)

作为提示:

(define (myreverse lst)
  (define (myreverse-aux lst acc)
    (if (null? <??>)
        <??>
        (myreverse-aux <??> (cons <??> <??>))))
  (myreverse-aux <??> <??>))

以下是使用foldl

的版本
(define (myreverse lst)
  (foldl cons '() lst))