您需要捕获某些累加器中的状态并在每次迭代时更新状态。
如果您有使用命令式语言的经验,请想象编写一个 while 循环并在循环的每次迭代期间跟踪变量中的信息。你需要什么变量?您将如何更新它们?这正是您在Scheme 中进行迭代(尾递归)调用集所必须要做的。
换句话说,开始将其视为 while 循环而不是递归定义可能会有所帮助。最终,您将足够流畅地进行递归 -> 迭代转换,无需额外的帮助即可开始。
对于这个特定的示例,您必须仔细查看三个函数调用,因为并不能立即清楚如何表示它们。然而,这是可能的思考过程:(在Python伪代码中强调命令性)
每个递归步骤都会跟踪三件事:
f(n) = f(n - 1) + 2f(n - 2) + 3f(n - 3)
所以我需要三个状态来跟踪当前、最后一个和倒数第二个值f
。 (那是,f(n-1), f(n-2) and f(n-3)
。) 给他们打电话a, b, c
。我必须在每个循环内更新这些部分:
for _ in 2..n:
a = NEWVALUE
b = a
c = b
return a
那么什么是NEWVALUE?好吧,现在我们已经有了代表f(n-1), f(n-2) and f(n-3)
,这只是递归方程:
for _ in 2..n:
a = a + 2 * b + 3 * c
b = a
c = b
return a
现在剩下的就是找出初始值a, b and c
。但这很容易,因为我们知道f(n) = n if n < 3
.
if n < 3: return n
a = 2 # f(n-1) where n = 3
b = 1 # f(n-2)
c = 0 # f(n-3)
# now start off counting at 3
for _ in 3..n:
a = a + 2 * b + 3 * c
b = a
c = b
return a
这与Scheme迭代版本还是有点不同,但我希望你现在能看到这个思考过程。