我是计划的新手,所以我提前为这个基本问题道歉。我正在尝试创建递归降序列表。目前,它返回(1 2 3)
而不是(3 2 1)
我认为问题是,我将新元素放在前面而不是列表的末尾。但是,我不太确定如何获得它,因为我在尝试时不断出错。
这是我到目前为止所拥有的:
(define (descend N mylist)
(if (= N 0) mylist
(descend (- N 1) (cons N mylist))))
(descend 3 '())
答案 0 :(得分:0)
首先,mylist
参数完全没必要。它永远不会是空列表,所以它可以简单地省略。
其次,如果您不需要将函数设置为尾递归,那么只需将调用结构重新排序为cons
和descend
,以便列表以相反的方向构建
(define (descend N)
(if (= N 0) '()
(cons N (descend (- N 1)))))
如果你需要一个尾递归版本,那么创建一个带辅助循环的累加器并简单地反向迭代可能更有意义。
(define (descend N)
(let loop ((x 1)
(acc '()))
(if (= x N) (cons x acc)
(loop (+ x 1) (cons x acc)))))