这个递归函数是迭代的吗?

时间:2014-05-20 21:37:39

标签: algorithm recursion scheme

我正在观看sicp讲座,在视频1b中,sussman调用algo 1迭代。他说方法2是递归的。根据我的理解,两者都是递归算法。我怎样才能最好地考虑方法1?作为迭代递归算法?

https://www.youtube.com/watch?v=dlbMuv-jix8

方法1 - 时间复杂度为o(x),空间为o(1)

 (define (+ x y)
        (if (= x 0)
            y
            (+ (-1+ x) (1+ y))))

方法2 - 时间补码是o(x),空间是o(x)

(define (+ x y)
    (if (= x 0)
        y
        (1+ (+ (-1+ x) y))))

3 个答案:

答案 0 :(得分:1)

两者都是递归的,但某些语言(如Scheme)要求实现在第一个示例中执行tail call elimination尾递归子例程是在控制流中调用自身 last 的子例程。这些子程序可以由解释器/编译器重新组织,以便迭代执行它们以节省堆栈空间。

答案 1 :(得分:1)

你的第一个例子是尾递归,因此是迭代的,第二个例子是堆栈增长而不是。

在SICP视频中,他们迭代地调用尾递归过程。即使递归是Scheme中唯一的循环机制,它们也倾向于将非迭代过程称为递归过程。 (do之类的东西只是尾递归过程调用的语法糖。) 对尾部递归过程的反面没有一个好名字。

尽管如此,Sussman既是Scheme的作者之一,又是SICP的作者之一,所以他所有的巫师都是最伟大的。该视频来自80年代,当时的报告是R3RS。即使他们使用的语言是Scheme的旧版本,它与当今最常用的方案报告R5RS相差不远。

答案 2 :(得分:0)

第一个算法在表达方式上是递归的,但请注意它是尾递归(也称为tail call) - 递归调用是算法中的最后一个。尾递归被简单地转换为迭代。在第二个算法中,递归调用用于计算其中一个参数,因此不是尾递归。

观看视频我并不感到烦恼,但我想这就是为什么第一种算法被描述为迭代的原因。