【问题标题】:Is this recursive function iterative?这个递归函数是迭代的吗?
【发布时间】:2023-03-20 05:00:01
【问题描述】:

我正在观看 sicp 讲座,在视频 1b 中,sussman 调用算法 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))))

【问题讨论】:

  • 这本书非常好,可以在线获取,并且有一个pretty good discussion 说明在 SICP 中实现迭代过程的递归过程意味着什么.您还可以在线查找(合法!)该书的电子书和 pdf 版本。
  • 谢谢!讨论链接将要点带回家。我刚刚实现了一个迭代版本的阶乘。

标签: algorithm recursion scheme


【解决方案1】:

您的第一个示例是尾递归的,因此是迭代的,第二个示例增加了堆栈而不是。

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

不过,Sussman 既是 Scheme 的作者之一,也是 SICP 书籍的作者之一,所以在所有巫师中他是最伟大的。视频是80年代的,当时的报道是R3RS。即使他们使用的语言是旧版本的 Scheme,它也与当今最常用的方案报告 R5RS 相距不远。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      我没有看视频,但我想这就是第一个算法被描述为迭代的原因。

      【讨论】:

        猜你喜欢
        • 2015-02-11
        • 1970-01-01
        • 1970-01-01
        • 2011-05-23
        • 1970-01-01
        • 2017-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多