您的代码中有几个错误,对于初学者来说,您不需要在 a 中定义一个全局变量let
来存储结果,在递归中推进时构建答案就足够了。并且不要append
在这种情况下使用,如果密切遵循解决方案模板,acons
就足以构建输出列表。
您应该坚持递归构建新列表的秘诀;这就是使用该配方解决问题的方法,它可能更像是这样的惯用语:
(define preplist
(lambda (x y)
(cond ((> x y) ; if the exit condition is met
empty) ; then return the empty list
(else ; otherwise
(cons x ; cons the current element
(preplist (add1 x) y)))))) ; and advance the recursion
一种完全不同的方法是编写尾递归解决方案。这更有效,因为使用了恒定数量的堆栈。它不遵循上面概述的设计配方,但与您想到的解决方案有点相似 - 但请记住,这不使用全局变量(仅let
用于迭代的命名)并且解决方案是累积的并作为参数传递:
(define (preplist x y)
(let loop ((i y) ; named let for iteration
(acc empty)) ; define and initialize parameters
(if (> x i) ; if exit condition is met
acc ; return accumulated value
(loop (sub1 i) ; otherwise advance recursion
(cons i acc))))) ; and add to the accumulator
range
当然,正如@dyoo 在评论中指出的那样,在实际设置中,您将使用与该过程基本相同的内置preplist
过程。