我不确定如何将count-forwards转换为尾递归程序。它采用非负数n
,并返回从0
到n
的整数列表(包括n
)。
编辑:好的,我终于让这个工作了。问题不是我当前的程序是递归的,我需要让它尾递归 - 这是完全错误的。实际答案非常简洁。因此,如果其他任何人都坚持这个并且也是一个完整的编程菜鸟,这里有一些可能有帮助的提示:
1)您的帮助程序旨在跟踪目前为止的列表。
2)它的基本情况是..如果x = 0 ..你做什么?将0加到..某事上。
3)重复x - 1,然后将x添加到您的列表中。
4)当你到达实际的程序时,你需要的只是帮助者。但请记住,它需要两个参数!
答案 0 :(得分:5)
这里唯一的递归函数是list-reverse。它是尾递归的,因为对它自身的调用是函数体中的最后一个操作。
用于生成从0到m
的非递减序列的函数,其中包含将1
添加到前一个元素的连续结果,如下所示:
(define (my-reverse lst)
(define (rev-do xs ys)
(if (empty? xs)
ys
(rev-do (cdr xs) (cons (car xs) ys))))
(rev-do lst empty))
(define (seq m n)
(seq-do m n (list m)))
(define (seq-do m n xs)
(if (= m n)
(my-reverse xs)
(let ((next (add1 m)))
(seq-do next n (cons next xs)))))
(define (seq-from-zero m)
(seq 0 m))
测试:
> (seq-from-zero 10)
(0 1 2 3 4 5 6 7 8 9 10)
seq-do
是用于生成从m
到n
的非递减序列的一般函数;它是尾递归的,因为最后一个操作是对它自己的调用。
我也从头开始实施reverse
,以便您可以在作业问题中使用它。