我需要在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)
任何帮助将非常感激。
问题是如果(reverse (cdr lat))
返回一个列表,例如(3 2)
then (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))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)