c语言递归算法简单例子,Python递归算法经典实例
在算法分析中,如果一个算法包含递归调用,那么对其时间复杂度的分析将转化为一个递归方程进行求解。其实这个问题是渐近阶的数学解。递归方程的形式多种多样,求解方法也各不相同。以下四种方法是常用的。
(1)替代法)。
赋值法的基本步骤是先猜测递归方程的显式解,然后通过数学归纳法验证解是否合理。
2)迭代法。
迭代法的基本步骤是将递归方程右端迭代展开为非递归和,通过和的估计来估计方程左端的解。
(3)运用公式法(主要方法)
该方法应用于形式为“t(n )=at) n/b) f) n)”的递归方程。这个递归方程是一个满足分治法时间复杂度的递归关系,即把所有规模为N的问题分解成规模为n/b的A问题,递归求解这个A问题,然后综合这个A问题的解得到原问题的解。
(4)差分方程法)。
将部分递归方程视为差分方程,通过求解差分方程可以求解递归方程,并估计解的渐近阶。
给出了几个例子来说明上述方法。
一、替代法
大整数乘法时间递归方程为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))(n))(n))(n))t(n)=4t(n/2)o)(n))t)n))n))n))n))n)n)n)n)n)n)n)n)n)n)n)n)
4c(n/2)2-EO(2n/2)(o)n))))))))(n))(n))(n))n))n))n))n))n))n))n))n))n))n))n))n))n))n))n))n))n))n))n))n))n))n))n))n))n))n))n))n))n))n))n))n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)n)
=cn2-EO(n ) o ) n)
cn2
这里,设C是一个正常数,E是1。上面的公式可以看作是t(n(CN2的定义,那么o) n2)是t) n)的一个解,用数学归纳法证明。
来自:一篇文章:
由于求解递推公式的重要性,很多算法书都有介绍。Donald Knuth在《具体数学》一书的几个章节中讨论了递归求解方法。算法的介绍也是第四章专门讨论的话题。
在这些相关讨论中,主要介绍了几种启发式方法,但这些方法往往需要特殊的技术和灵感才能完成。
本文讨论了将递推公式转化为求解多项式根和线性方程组的纯代数公式的方法。这样整个计算过程对技巧的依赖更少,可用性提高。
首先用纯代数求解斐波那契数列和汉诺威递推公式,然后用线性代数讨论这种方法背后的数学意义,说明线性递推公式和线性方程的内在联系及其求解的数学原理。最后将这种方法推广到大众。
旋转:3358博客.编码labs.org/articles/linear-algebra-for-recursion.html
二。迭代法
给定算法的计算时间为t(n )=3t (n/4) o) n)。这里t )1)=o )1),如果重复两次,右端可以展开如下。
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/4i 1))
在n/4i 1=1的情况下,在t(n/4I1 )=1的情况下
t(n)=n)3/4)32/42)n .)32/42)n)3 i1)t)1))1))652)
4n 3i 1
另一方面,从n/4i 1=1可以看出,I
3 i13 log4n 1=3 log3n * 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) nlog ba),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-)
在这里处理的三种情况下比较F(n)和nlogba,递归方程的解的渐近程度由这两个函数中的较大者决定。第一种情况,如果函数nlogba较大,则t(n)=o)nlogba);在第三种情况下,如果函数f(n)较大,则t)n)=o)f)n);第二种情况,如果两个函数大小相同,则乘以t(n )=o) nlogba*logn),即f(n)和t(n)的相同时间乘以n的对数作为因子。
但是,以上三种情况并没有涵盖所有可能的f(n)。第一种情况和第二种情况之间有差距。F(n)小于nlogba而不是多项式。第二类和第三类之间也是如此。在这种情况下,该公式不适用。
主题:
如果n有根号,乍一看好像主定理不能适用,但是我们可以通过meta之类的技巧把递推公式转化为主定理求解的公式。
另一方面,对于某个公式,如上所述,看似可以用MM解决,实际上三者都不满足。例如,以下内容:
其他:
33558号
vmh.html blog.Sina.com.cn/s/blog 4ABA 4b 3358号,邮编7101013
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。