如何处理循环递归关系?

时间:2014-06-13 16:44:32

标签: algorithm language-agnostic dynamic-programming

出现这样的问题时我会陷入困境:

假设我想找foo(n)。我知道foo(n)的公式,但在计算中包含foo(n-1)foo(n+1)

如果我试图用一个天真的递归函数解决这些问题,那么这两个函数调用将再次通过它们调用父函数。这会导致无限循环!例如尝试解决foo(n)会涉及调用foo(n+1),这会回拨foo(n),依此类推。

是否有一般技术可以解决这类特殊问题,而不依赖于对来自foo(n)foo(n-1)的{​​{1}}的精确计算的任何假设?

修改

在我的示例中,我知道特定foo(n+1)的{​​{1}}和foo(n) = 0,我想计算foo(n-1) = 1n之间的所有值。

1 个答案:

答案 0 :(得分:3)

实际上解决这个问题非常简单。如果你有类似的关系:

f(n) = f(n+1) - f(n-1)

您所要做的就是从每个内部术语中减去正k,这样任何术语都不会高于n。例如,在这种情况下,k将是1

f(n-1) = f(n) - f(n-2)

然后重新排列:

f(n) = f(n-1) + f(n-2)

您可能认为斐波那契序列。这只是一个例子,f(n)f(n+1)f(n-1)之间的关系并不重要,只要它是一个可以反转的函数,你总是可以将函数参数转换为将其转换为f(n)f(n-1)f(n-2)的函数。另一个例子:

f(n) = f(n+1) / f(n-1)
f(n-1) = f(n) / f(n-2)
f(n) = f(n-1) * f(n-2)

更一般地说,如果你有:

f(n) = H[f(n+1), f(n-1)]

然后你可以将其转换为:

f(n) = H-1[f(n-1), f(n-2)]

其中H是函数,H -1 是其反函数。

这假设您在下限有两个值并且想要向上步。 (例如f(0) = 1, f(1) = 1)。如果您有上限并希望下台,那么您需要添加k而不是减去