之前做了一道算法题,根据题意能推导出一个公式:
f(n)={1,n=13f(n−1)+2,n≥2 f(n)= \begin{cases} 1, & n=1 \\ 3f(n-1)+2, & n\ge 2 \end{cases} f(n)={1,3f(n−1)+2,n=1n≥2
这里的n是整数。
看到这个公式自然而然地想到使用递归的方式编程解决。
在n很小的时候这没问题,但是当n大的时候,即使n=20时,递归也有20层调用栈的开销。
因此想到推导通向公式。
当前的这个公式是一阶线性递推 公式,即形如f(n)=af(n-1)+b的形式
如何根据f(n)的递推公式推导出f(n)的通项公式呢?
假设存在一个常数k,使得
g(n)=f(n)+k g(n)=f(n)+k g(n)=f(n)+k
那么
f(n)=g(n)−k f(n)=g(n)-k f(n)=g(n)−k
从公式
f(n)=3f(n−1)+2 f(n)=3f(n-1)+2 f(n)=3f(n−1)+2
可以得到
g(n)−k=3g(n−1)−k+2 g(n)-k=3g(n-1)-k+2 g(n)−k=3g(n−1)−k+2
=>
g(n)=3g(n−1)−2k+2 g(n)=3g(n-1)-2k+2 g(n)=3g(n−1)−2k+2
想让常数项消失得使
−2k+2=0 -2k+2=0 −2k+2=0
即
k=1 k=1 k=1
得到
g(n)=3g(n−1) g(n)=3g(n-1) g(n)=3g(n−1)
结合
g(1)=f(1)+k=1+1=2 g(1)=f(1)+k=1+1=2 g(1)=f(1)+k=1+1=2
可以得到g(n)通项公式
g(n)=2∗3n−1 g(n)=2*3^{n-1} g(n)=2∗3n−1
因此
f(n)=g(n)−k=2∗3n−1−1 f(n)=g(n)-k=2*3^{n-1}-1 f(n)=g(n)−k=2∗3n−1−1
总结一下,
对于f(n)=af(n-1)+b的递推公式,令g(n)=f(n)+k,结合f(n)的递推公式,可以得到g(n)=pg(n-1)+qk+r,通过令qk+r=0的方式消除掉常数项,得到k,进而推导出g(n)的通项公式,从而得到f(n)的通项公式。
还是当年高中nb,现在啥也不会hhh