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