recursion - 尾递归调用尾递归

标签 recursion clojure functional-programming tail-recursion

我正在尝试用尾递归求解帕斯卡三角形。我理解做尾递归,函数调用语句应该是最后一条指令。就像这里:

(defn pascal [line colum, acc]
  (if (or (= line 0) (= line colum) (= colum 0))
    (+ acc 1)
    (recur (dec line) colum
           (pascal (dec line) (dec colum), acc))))

我的问题是:由于我使用递归调用作为递归参数,它仍然有效吗?

因为我无法替换这个:

(recur (dec line) colum
       (pascal (dec line) (dec colum), acc))))

对此:

(recur (dec line) colum
       (recur (dec line) (dec colum), acc))))

最诚挚的问候

最佳答案

只有一半的调用是通过尾递归进行的,因此另一半可能会破坏堆栈。与此比较:

(defn factorial (n) 
  (if (= n 1)
      1
      (* n (factorial (n - 1)))))

这里(factorial (n - 1))需要在继续之前完成 (* n <result>)这是递归运行时等待的堆栈帧。

这比都不是尾调用要好,但如果全部都是 and it is possible! 就更好了

关于recursion - 尾递归调用尾递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34297481/

相关文章:

clojure - 为什么 Clojure 允许 (eval 3) 尽管 3 没有被引用?

clojure - 如何从 clojure 中很好地调用其他 JVM 语言?

javascript - JS 递归映射对象名称

javascript - 如何在递归方法中进行同步调用?

c++ - 为什么预减会引起奇怪的变化?

macros - Clojure中的广义线程宏

python - Tensorflow model.summary() 不显示层信息

Scala:收集不可变状态的更新/更改

scala - 函数式编程是否可以减少冯·诺依曼瓶颈?

objective-c - 通过 iOS Twitter API 递归使用 objective-c block