出现这样的问题时我会陷入困境:
假设我想找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) = 1
和n
之间的所有值。
答案 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
而不是减去