【发布时间】:2015-12-16 07:36:52
【问题描述】:
我最近开始阅读SICP,我对将递归过程转换为尾递归形式非常感兴趣。
对于“一维”情况(线性情况),例如斐波那契数列或阶乘计算,进行转换并不难。
例如,正如书中所说,我们可以将斐波那契计算重写如下
(define (fib n)
(fib-iter 1 0 n))
(define (fib-iter a b count)
(if (= count 0)
b
(fib-iter (+ a b) a (- count 1))))
而且这种形式显然是尾递归
但是,对于“二维”情况,例如计算帕斯卡三角形(SICP 中的 Ex 1.12),我们仍然可以轻松编写如下递归解决方案
(define (pascal x y)
(cond ((or (<= x 0) (<= y 0) (< x y )) 0)
((or (= 1 y) (= x y) ) 1)
(else (+ (pascal (- x 1) y) (pascal (- x 1) (- y 1))))))
问题是,如何将其转化为尾递归形式?
【问题讨论】:
-
你的右括号会激怒人们。请将它们全部收集在一行中,以便有人开始响应;)
-
@Phil,我只是认为 align 在一列中的括号可能会使代码更清晰,因为将两个许多右括号放在一起似乎有点难以匹配它们
-
我建议你找一个为你做匹配的编辑器。一个专门用于像 DrRacket 这样的方案也可以通过正确识别您的代码来显示。
-
你可能总是很懒惰并利用帕斯卡三角形的任何元素都由 row!/(column!(row - column)!) 给出的事实。不过,这不是您问题的答案。
标签: recursion scheme tail-recursion sicp pascals-triangle