这个过程是递归的还是迭代的(长尾递归)?

时间:2016-11-16 22:21:32

标签: scheme lisp racket

以下代码用于实现名为" 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)

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

1 个答案:

答案 0 :(得分: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 '()))

我不确定“尾递归”是什么意思,我从来没有听过这句话,我也找不到谷歌。