我正在观看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))))
答案 0 :(得分:1)
两者都是递归的,但某些语言(如Scheme)要求实现在第一个示例中执行tail call elimination。 尾递归子例程是在控制流中调用自身 last 的子例程。这些子程序可以由解释器/编译器重新组织,以便迭代执行它们以节省堆栈空间。
答案 1 :(得分:1)
你的第一个例子是尾递归,因此是迭代的,第二个例子是堆栈增长而不是。
在SICP视频中,他们迭代地调用尾递归过程。即使递归是Scheme中唯一的循环机制,它们也倾向于将非迭代过程称为递归过程。 (do
之类的东西只是尾递归过程调用的语法糖。)
对尾部递归过程的反面没有一个好名字。
尽管如此,Sussman既是Scheme的作者之一,又是SICP的作者之一,所以他所有的巫师都是最伟大的。该视频来自80年代,当时的报告是R3RS。即使他们使用的语言是Scheme的旧版本,它与当今最常用的方案报告R5RS相差不远。
答案 2 :(得分:0)
第一个算法在表达方式上是递归的,但请注意它是尾递归(也称为tail call) - 递归调用是算法中的最后一个。尾递归被简单地转换为迭代。在第二个算法中,递归调用用于计算其中一个参数,因此不是尾递归。
观看视频我并不感到烦恼,但我想这就是为什么第一种算法被描述为迭代的原因。