【问题标题】:Is this procedure recursive or iterative (long tail recursion)?这个过程是递归的还是迭代的(长尾递归)?
【发布时间】:2017-03-31 07:38:06
【问题描述】:

以下代码用于实现一个名为"build-list"的内置函数:

(define (my-build-list-book n f)
 (define (builder k)
   (cond [(= n k) empty]
         [else (cons (f k) (builder (add1 k)))]))
  (builder 0))

(my-build-list-book 10 add1)
>> '(1 2 3 4 5 6 7 8 9 10)

这是迭代过程的递归定义还是递归过程的递归定义?

【问题讨论】:

    标签: scheme lisp racket


    【解决方案1】:

    builder 是递归的,因为它调用自己:(builder (add1 k))

    它不是尾递归,因为对自身的调用不是在从原始过程返回值的地方完成的。它使用递归调用的结果作为cons 的参数而不是返回值。

    尾递归变体将以如下形式结束:

    [else (builder ...)]
    

    将这样的函数转换为尾递归通常需要添加一个包含累积结果的附加参数,该结果由基本情况返回。

    (define (my-build-list-book n f)
      (define (builder k result)
        (cond [(= n k) result]
              [else (builder (add1 k) (cons (f k) result))]))
      (builder 0 '()))
    

    我不确定您所说的“尾递归”是什么意思,我从未听说过这个短语,而且我在 Google 上也找不到。

    【讨论】:

    • 对不起,@Barmar。我想我搞砸了这些概念。我查了SICP书,没有长尾递归……对不起!
    • 另见“tail-recursive modulo cons”,编译器预先分配 cons 单元并在生成的代码中添加 set-cdr! 操作(或等效的东西,基本上累加器是隐式的)。 en.wikipedia.org/wiki/Tail_call#Tail_recursion_modulo_cons
    猜你喜欢
    • 2011-05-23
    • 2020-12-21
    • 2018-12-29
    • 2011-09-21
    • 2014-03-24
    • 2011-11-14
    • 2012-06-16
    相关资源
    最近更新 更多