如何用生成函数求解递归方程f(n)=2f(n/2)+cn

算法的东西不上这儿上哪里呀,同志

解:

令f(1)=c

f(2)=2c+2

f(4)=2(2c+2)+4 = 4c+8

f(8) = 2(4c+8)+8 = 8c+24

f(16) = 2(8c+24)+16 = 16c+64

f(2^k) = c*2^k + P(k)

考虑P(k)

P(0) = 0

P(1) = 2 *P(0) + 2

P(2) = 2*P(1)+4

p(n-2) = 2*P(n-3)+2^(n-2)

p(n-1) = 2*P(n-2)+2^(n-1)P(n) 

= 2* P(n-1) + 2^n = 2*2*P(n-2)+2*2^(n-1)+2^n 

= 4P(n-2)+2*2^n

= 4*2P(n-3)+4*2^(n-2)+2*2^n

归纳得到P(n) = 2^kP(n-k)+k*2^n = 2^nP(n-n)+n*2^n =n*2^n

所以P(n-1) = (n-1)2^(n-1)

2*P(n-1)+2^n = 2*(n-1)*2^(n-1) + 2^n=P(n) 得到验证

带回f(2^k)得到f(2^k) = c*2^k+k*2^k,对于任意常数c成立

扩展资料

性质:

1、 子问题须与原始问题为同样的事,且更为简单。

2、不能无限制地调用本身,须有个出口,化简为非递归状况处理。

3、由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。

4、递归算法解题相对常用的算法如普通循环等,运行效率较低。因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-10-04
记n = 2^k, f(n) = f(2^k) = h(k),
那么有h(k) = 2*h(k-1) + c*2^k
记 // sigama就是求和号,这里打不出来,只好这样写
// sigama[k=0,无穷]分别是求和号的下标和上标
G(x) = sigama[k=0,无穷] h(k)*x^k
2x*G(x) = sigama[k=0,无穷] 2*h(k)*x^(k+1)
G(x)-2*x*G(x) = (1-2x)*G(x)
= h(0) + sigama[k=0,无穷] (h(k+1) - 2*h(k))*x^(k+1)
= h(0) + c * sigama[k=0,无穷] 2^(k+1)*x^(k+1)
= h(0) + c * sigama[k=0,无穷] (2*x)^(k+1)
= h(0) + c * (2*x/(1-2*x))

故G(x) = h(0)/(1-2*x) + c * (2*x/(1-2*x)^2)
= h(0)/(1-2*x) + c * (1/(1-2*x)^2 - 1/(1-2*x))
= (h(0) - c) * 1/(1-2*x) + c * 1/(1-2*x)^2
= (h(0) - c) * sigama[k=0,无穷] (2*x)^k
+ c * sigama[k=0,无穷] (k+1)(2*x)^k
// 为了方便计算设f(1) = h(0) = 0, f(2) = h(1) = 2*c
// 其实不这样设也可以的,计算过程与下面类似
= (- c) * sigama[k=0,无穷] (2*x)^k
+ c * sigama[k=0,无穷] (k+1)(2*x)^k
= c * sigama[k=0,无穷] k * (2*x)^k
= sigama[k=0,无穷] c * k * (2*x)^k
= sigama[k=0,无穷] h(k)*x^k

所以h(k) = c * k * 2^k,
而n = 2^k
则f(n) = h(k) = c * k * 2^k = c * n * log2 n;
// log2 n 表示以2为底的对数
f(n) = O(n * log2 n)本回答被提问者采纳

如何用生成函数求解递归方程f(n)=2f(n\/2)+cn
2*P(n-1)+2^n = 2*(n-1)*2^(n-1) + 2^n=P(n) 得到验证 带回f(2^k)得到f(2^k) = c*2^k+k*2^k,对于任意常数c成立

如何用生成函数求解递归方程f(n)=2f(n\/2)+cn
(2*x\/(1-2*x)^2)= h(0)\/(1-2*x)+ c (1\/(1-2*x)^2 - 1\/(1-2*x))= (h(0)- c)1\/(1-2*x)+ c 1\/(1-2*x)^2 = (h(0)- c)

《算法导论》三种解递归式的方法
代入法要求证明,恰当选择常数 c>0,可有 T(n)≤cn lgn。首先假设此上界对所有正数 m<n 都成立,特别是对于 m=n\/2,有 T(n\/2)≤c(n\/2)lg(n\/2)。将其代入递归式,得到: 其中,只要 c≥1,最后一步都会成立。 并不存在通用的方法来猜测递归式的正确解,但总有一些试探法可以帮助做出好的猜测: 如果某...

斐波那契数列相关问题精讲
方法1:待定系数法构造满足等比的新数列 方法2:利用差分方程理论求解 方法3:矩阵幂法 方法4:生成函数(generating function),也称为母函数法 以斐波那契数列通项为例,逐一展示以上方法 方法1:公式 待定系数得到公式 的通项公式后继续凑等比数列即可。方法2:递推公式可以当作为一个差分方程看待。有...

Catalan数
也就是说,不一定每个生成函数都是用一长串多项式来表示的。比如,这个函数f(n)=1 (n当然是属于自然数的),它的生成函数就应该是g(x)=1+x+x^2+x^3+x^4+...(每一项都是一,即使n=0时也有x^0系数为1,所以有常数项)。再仔细一看,这就是一个有无穷多项的等比数列求和嘛。如果-1<x<1,那么g(x)...

我的孩子今年小学五年级,要参加Turbo Pascal 7.0小学程序设计竞赛_百度...
55. 根据键盘输入的两个数G和H,求出[G,H]中的所有质数.如果G<=2或G>H则要求重新输入. 56. 用递归方法求幂函数mn.57. 跳马问题,5*5方阵,从左上角出发,跳遍所有格.58. 一梯子有N格,小明上梯子有时一步上1格,有时一步上2格,编一程序,对任意输入的自然数N,打印出上梯子的所有可能的上法,并指出...

如何用生成函数求解递归方程H(n)=H(n-1)+9H(n-2)-9H(n-3),n>2 H(0...
用C吗?不是很难的哦,不过只有五分,有谁愿意敲那么多东西啊

牛顿迭代法牛顿迭代公式
其基本步骤是:首先,选择一个初始近似值x0,计算函数在该点的切线L,其方程为y = f(x0)+f'(x0)(x-x0)。切线与x轴的交点横坐标x1(x1 = x0-f(x0)\/f'(x0))作为一次近似值。然后,继续在x1处做切线,找到下一个近似值x2,如此反复进行,形成序列{x(n+1)=x(n)-f(x(n))\/...

c语言:用递归方法编写程序,求n阶勒让德多项式的值
if (n == 1) { return x;} return ((2 * n - 1)*x - legendre(n - 1, x) - (n - 1)*legendre(n - 2, x)) \/ n;} void main() { int n;int x;printf("请输入n的值和x的值\\n");scanf("%d %d", &n, &x);printf("P%d(%d) = %f\\n", n, x, legendre(n...

这该怎么做?高数求解
微分方程F要满足:把它对x求导,会得到:fc1,c2表示,从x到f(x,c1,c2)的映射。 如果这个方程对c1有解,就可以推出另外一个三元函数G,它对任意x都满足:再对x求导,就会得到:最后,整理出清爽的微分方程:它的解就是fc1,c2。 至于生成过程,举个例子:现在,求积分和求解微分方程两个训练集都有了。那么问题也来...

相似回答