关于递归的时间复杂度

rbws 2002-05-30 02:44:36
递归算法的时间复杂度应该怎样计算?
如果消去递归,即自己做栈代替系统栈的话,时间复杂度会减少吗?
再有一个问题,什么样的递归在消去的时候可以不用栈直接迭代就行?
...全文
1437 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ahahai 2002-06-07
  • 打赏
  • 举报
回复
递归和递推成一码事了吗?
zhoukun666 2002-06-07
  • 打赏
  • 举报
回复
用通用公式:T(n)=f[T(n-1)]
f(x)是递归函数的时间复查性函数!
例如下面这个简单递归是:
void Digui()
{
1-----;/*假设该语句的复查性是a*/
2----------;/*假设该语句的复查性是b*/
for()/*循环M次*/
{-----;/*假设该语句的复查性是c*/
Digui(); }
这它的时间复查性计算公式是:T(n)=a+b+M*T(n-1);
starfish 2002-06-05
  • 打赏
  • 举报
回复
PS: 上述的三个变换是将满足一定条件的递归转化为尾递归,然后尾递归可以直接转化为迭代
starfish 2002-06-05
  • 打赏
  • 举报
回复
1。计算递归算法的复杂度只要建立递归方程求解就可以了,具体方法有很多,最常用的是一种称为“主定理(master theorem)”的套用公式法。
你可以参考
http://algorithm.myrice.com/algorithm/complexity/chapter6.htm
2。递归算法如果用堆栈改写,其复杂度几乎没有改变;
3。不是所有的递归算法都可以改写成相应的迭代算法的(用了堆栈就不是迭代了,所谓迭代算法应该是指空间复杂度为O(1),即常数的算法);
4。尾递归是最容易改写成迭代的一类递归,但是还有很多其他的递归也可以改写成迭代。你可以参考程序等价变换的相关资料。
5。下面三个变换模式可以将很多常见的递归转化为迭代:

[Cooper变换]
输入模式:
f(x) ≡ if b(x) then h(x)
else F(f(k(x)), g(x))
输出模式:
f(x) ≡ G(x, e)
G(x, y) ≡ if b(x) then F(h(x), y)
else G( k(x), F(g(x),y) )
其中:
x, k: TYPE1, k(x) -< x ( 符号 -< 表示偏序)
y, G, h, g, f, F: TYPE2
b: boolean
e: F的右单位元,即F(x, e) = x

可用性条件:
(1)F满足结合律,即F(F(x,y),z) = F(x, F(y, z))
(2)F有右单位元e;
(3)b, h, g, k中都不含f

=====================================================

[拓广的Cooper变换]
输入模式:
f(x) ≡ if b(x) then h(x)
else if b1(x) then F1( f( k1(x) ), g1(x) )
...
else if bn(x) then Fn( f( kn(x) ), gn(x) )
else F0( f( k0(x) ), g0(x) )

输出模式:
f(x) ≡ if b(x) then h(x)
else if b1(x) then G1( k1(x), g1(x) )
...
else if bn(x) then Gn( kn(x), gn(x) )
else G0( k0(x), g0(x) )

对于所有的 0≤i≤n,
Gi( x, y) = if b(x) then Fi( h(x), y )
else if b1(x) then Gi( k1(x), F1( g1(x), y ) )
...
else if bn(x) then Gi( kn(x), Fn( gn(x), y ) )
else Gi( k0(x), F0( g0(x), y ) )

其中:
对于所有的 0≤i≤n
x, ki: TYPE1, ki(x) -< x ( 符号-< 表示偏序)
gi, h, Fi, Gi, y: TYPE2
b, bj: boolean, 1≤j≤n
b(x)∧b1(x)∧……∧bn(x) = φ (空集)
b(x)∨b1(x)∨……∨bn(x) = Ω (全集)

可用性条件:
(1)Fi满足结合律,即Fi( Fj(x, y), z ) = Fj( x, Fi(y, z) ), 0≤i, j≤n
(2)b, bj, h, gi, ki中都不含f, 0≤i≤n, 1≤j≤n

=====================================================

[反演变换]
输入模式:
f(x) ≡ if b(x) then h(x) else F( f(k(x)), g(x) )
输出模式:
f(x) ≡ G(x, x0, h(x0))
G(x, y, z) ≡ if y=x then z
else G(x, k'(y), F( z, g(k'(y))) )
可用性条件:
(1)b(x)为真时可求出相应之x值x0;
(2)k(x)存在反函k'(x);
=====================================================
qtt 2002-06-05
  • 打赏
  • 举报
回复
一般的话,尾递归在消去的时候可以不用栈直接迭代就行.
kbsoft 2002-05-30
  • 打赏
  • 举报
回复
递归算法的时间复杂度应该怎样计算?

建立递归方程进行求解
one_add_one 2002-05-30
  • 打赏
  • 举报
回复
如果递归里面有循环复杂度一般都是指数级的。

如果自己做栈复杂度不会降低
我不懂电脑 2002-05-30
  • 打赏
  • 举报
回复
时间复杂度和循环方法应该是一样的,主要是空间复杂度和调用需要消耗时间。

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧