方案:将递归转换为尾递归

3
我不确定如何将count-forwards转换为尾递归程序。它接受一个非负整数n,并返回从0到n(包括n)的整数列表。
编辑:好吧,我终于让这个程序工作了。问题不是我的当前程序是递归的,而是我需要使它成为尾递归-它只是完全错误的。实际答案非常简短和干净。因此,如果其他人也卡在这里,而且也是完全的编程新手,这里有一些可能有帮助的提示:
1)您的辅助程序旨在跟踪到目前为止的列表。
2)它的基本情况是..如果x = 0..你会做什么?将0添加到..某物上。
3)在x-1上进行递归,然后将x添加到您目前的列表中。
4)当您到达实际程序count-forwards时,您只需要使用helper。但请记住,它需要两个参数!

我相信你的意思是“计数器递增”。 - Argote
哦!我没意识到它已经是尾递归了。o_o - mdegges
SO 或许不是询问硬件问题的最佳场所。 - erjiang
为什么不呢?:/ 我只知道 IRC 和 S.O. 作为在线资源来获取帮助。 - mdegges
1个回答

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是一种通用函数,用于生成从mn的非递减序列;它是尾递归的,因为最后一个操作是对自身的调用。

我还从头开始实现了reverse,这样你就可以在作业问题中使用它了。


my-reverse也是尾递归的。 - YasirA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接