首页 > 编程知识 正文

python递归函数详解,c语言递归算法经典实例

时间:2023-05-05 02:17:46 阅读:140313 作者:2129

在算法分析中,如果某个算法包含递归调用,则其时间复杂度的分析将转化为递归方程进行求解。 其实,这个问题是一个数学求解渐近阶的问题,递归方程的形式多种多样,其求解方法也各不相同。 常用的有以下四种方法。

(1)赋值法(Substitution Method ) )。

赋值法的基本步骤是先推测递归方程的显式解,然后用数学归纳法验证该解是否合理。

)2)迭代方法。

迭代法的基本步骤是将递归方程的右端迭代展开成非递归的和式,通过和式的估计达到方程左端方程解的估计。

(3)适用公式法(主方法)

该方法是针对类似“t(n )=at ) n/b ) f ) n )”形式的递归方程进行的。 这个递归方程是满足分治法时间复杂性的递归关系,即规模为n的问题都被分割为n/b的a个问题,递归地求解这个a个问题,然后通过综合这个a个问题的解得到原问题的解。

(4)差分方程法(Difference Formula Method ) )。

将部分递归方程视为差分方程,求解差分方程可以求解递归方程,并对解进行渐近阶估计。

通过几个例子说明以上方法。

一.代入法

大整数乘法时间的递归方程为t(n )=4t (n/2 ) o ) n )。 这里,t )1)=o )1)推测一个解t ) n )=o ) n2 ),根据符号o的定义,对于nn0,有t ) n ) cn2-eo ) )

t(n )=4t(n/2 ) o ) (n ) ) ) ) ) ) ) ) ) t(n )=4t(n/2 ) o ) ) ) ) ) ) ) ) t ) n ) ) ) n ) ) n ) ) n ) n ) n ) n ) n ) n ) n )

4c(n/2 )2-EO(2n/2 ) (o ) n ) ) ) ) ) ) ) ) ) ) ) ) n ) ) ) n ) ) ) ) ) n ) ) ) ) ) ) ) ) 65 ) 65

=cn2-EO(n ) o ) n )

cn2

这里,设c为正常数,e为1,以上式可以认为是t(n(cn2的定义,则o ) n2 )为t ) n )的一个解,用数学归纳法进行证明。

转自:一篇文章:

由于递推公式求解的重要性,许多算法书籍都专门介绍了它。 Donald Knuth在Concrete Mathematics一书中的几章中讨论了递归求解方法。 算法导论也是第四章专门论述的这个主题。

在这些相关论述中,主要介绍了几种启发式方法,但这些方法往往需要特殊的技术和灵感才能完成。

本文论述了将求解递推公式转换为求解多项式根和求解线性方程组的纯代数式的方法。 这样,整个计算过程就不太依赖技巧,提高了易用性。

首先用纯代数求解斐波那契数列和汉诺威递推公式,然后用线性代数论述了该方法背后的数学意义,说明了线性递推公式与线性方程的内在联系及其解法的数学原理,最后将该方法推广到公众。

自转: http://blog.coding labs.org/articles/linear-algebra-for-recursion.html

二.迭代法

给定算法的计算时间是t(n )=3t (n/4 ) o ) n )。 在此,t )1)=o )1),重复2次的话右端可以展开如下。

t(n )=3t(n/4 ) o ) (n ) ) ) ) ) ) ) ) t(n ) ) ) )。

=o(n )3) o ) n/4 ) 3t ) n/42 ) )

=o(n )3) o ) n/4 )3) o ) n/42 ) 3t ) n/43 ) )

从上式可以看出,这是递归方程式,可以写出重复了I次的方程式:

t(n )=o ) n )3) o ) n/4 )3) o ) n/42 )…3 ) n/4I3t ) n/4I1) )

在n/4i 1=1的情况下,在t(n/4I1 )=1的情况下

t(n )=n )3/4) 32/42 ) n . ) 32/42 ) n )3I1 ) t )1) )1) ) ) ) ) 652 )

4n 3i 1

另一方面,由n/4i 1=1可以看出,I

3 i13 log4n1=3log3n * log 431=3n log 43

赋值:

t(n ) 4n 3nlog43,即t ) n )=o ) n )。

三.适用官方法

该方法估计如下

t(n )=at(n/b ) t(n ) ) )。

其中,a1和b1都是常数,f(n )是确定的正函数。 在f(n )的3种情况下,我们有t ) n )的渐近估计式:

1 .对于给定常数0,如果存在f(n )=o ) nlogba- ) n )=o ) nlogba )

2.f(n )=o ) nlogba )时,t ) n )=o ) nlogba*logn ) )。

3.f(n )=o ) nlogba),且对于所有足够大的正整数n,如果af ) n/b(cf ) n ),t ) n )=o ) f(n ) )。

如果t(n )=4t ) n/2 ) n,则计算a=4,b=2,f ) n )=n,其中nlogba=nlog24=n2,f(n )=n=o(n2-)

这里处理的3种情况都比较了f(n )和nlogba,递归方程解的渐近次数由这两个函数中较大的一个决定。 在第一种情况下,如果函数nlogba较大,则t(n )=o ) nlogba ); 在第三类的情况下,如果函数f(n )较大,则t ) n )=o ) f ) n ); 在第二类情况下,如果两个函数大小相同,则乘以t(n )=o ) nlogba*logn ),即以n的对数为因子乘以f(n )和t ) n )的同次。

然而,上述三种情况并未涵盖所有可能的f(n )。 第一类情况和第二类情况之间有间隙。 f(n )小于nlogba而不是多项式。 第二类和第三类之间也有这种情况。 在这种情况下,不能应用公式。

主题:

如果n带有根号,乍一看似乎无法应用主定理,但我们可以通过元等trick将递归式转换为用主定理求解的公式

另一方面,对于某个公式,如上所述,看起来可以用MM来求解,但实际上不满足3个中的任意一个。 例如,以下内容:

其他:

33558 www.cn blogs.com/python 27/archive/2011/12/09/2282486.html

3358 blog.Sina.com.cn/s/blog _4ABA 4b 7101013 vmh.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。