【问题标题】:Iterative process vs a recursive process迭代过程与递归过程
【发布时间】:2019-02-10 09:54:45
【问题描述】:

通读SICP Distilled 并尝试围绕迭代与递归进程 展开思考。给出的例子是:

(defn + [a b]
  (if (= a 0) b (inc (+ (dec a) b))))

(defn + [a b]
  (if (= a 0) b (+ (dec a) (inc b))))

其中哪些是迭代过程(状态完全由迭代函数的参数维护),哪些是递归过程(状态必须在“幕后”保留,同时等待前面的函数调用完成.

我的猜测这里是第二个是迭代的,因为参数可以在参数被应用到函数之前被评估,而前者必须保持连续的函数调用堆栈,等待最后一个 + 操作完成,然后才能展开堆栈,在每个步骤中运行 inc

【问题讨论】:

  • 从来不知道蒸馏版,谢谢!

标签: recursion clojure tail-recursion sicp


【解决方案1】:

有一种简单的方法可以将迭代过程与递归过程区分开来,问问自己:在递归调用之后还有什么事情要做吗?如果答案是肯定的,那么就是一个递归过程,这就是这里发生的事情:

(inc (+ (dec a) b))
  ^
this is invoked after the recursive call

如果答案是否定的,那么这是一个迭代过程,这就是这里发生的情况:

(+ (dec a) (inc b))
 ^
the recursive call is the last thing we do

在第二种情况下,我们说+ 处于尾部位置,支持它的解释器将对其进行优化,请参见:tail call。 Clojure 无法进行尾调用优化,除非您使用 recur

【讨论】:

    猜你喜欢
    • 2013-06-19
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 2016-02-24
    相关资源
    最近更新 更多