【问题标题】:Scheme: changing recursion to tail recursion方案:将递归改为尾递归
【发布时间】:2011-07-01 15:37:53
【问题描述】:

我不确定如何将前向计数转换为尾递归程序。它接受一个非负数n,并返回从0n(包括n)的整数列表。

编辑:好的,我终于让这个工作了。问题不在于我当前的程序是递归的,而我需要使它成为尾递归的——这完全是错误的。实际的答案真的很简短。因此,如果其他人对此感到困惑并且也是一个编程新手,这里有一些提示可能会有所帮助:

1) 您的帮助程序旨在跟踪到目前为止的列表。

2) 它的基本情况是.. 如果 x = 0.. 你会做什么?加0到..某事。

3) 在 x - 1 上重复,然后将 x 添加到您的列表中。

4) 当您开始执行实际程序时,向前计数,您所需要的只是助手。但请记住,它需要两个参数!

【问题讨论】:

  • 我相信你的意思是count-up
  • 哦!我没有意识到它已经是尾递归了。 o_o
  • SO 可能不是问硬件问题的最佳场所。
  • 为什么不呢? :/ 我只知道 irc 和 s.o.作为获取帮助的在线资源。

标签: recursion functional-programming scheme tail-recursion


【解决方案1】:

这里唯一的递归函数是 list-reverse。它是尾递归的,因为对自身的调用是函数体中的最后一个操作。

用于生成从零到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 也是尾递归的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多