递归函数时间复杂度分析一

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

递归算法的时间复杂度分析

(1) 递归执行过程 

   例子:求N!。 
    这是一个简单的"累乘"问题,用递归算法也能解决。 
    n! = n * (n - 1)!   n > 1 
    0! = 1, 1! = 1      n = 0,1 
    因此,递归算法如下: 
   
Java代码 
fact(int n) {  
    if(n == 0 || n == 1)   
         return 1;  
        else   
             return n * fact(n - 1);  
    }  
    以n=3为例,看运行过程如下: 
    fact(3) ----- fact(2) ----- fact(1) ------ fact(2) -----fact(3) 
    ------------------------------>  ------------------------------> 
                递归                            回溯 
  递归算法在运行中不断调用自身降低规模的过程,当规模降为1,即递归到fact(1)时,满足停止条件停止递归,开始回溯(返回调用算法)并计算,从fact(1)=1计算返回到fact(2);计算2*fact(1)=2返回到fact(3);计算3*fact(2)=6,结束递归。 
   算法的起始模块也是终止模块。 
(2) 递归实现机制 
    每一次递归调用,都用一个特殊的数据结构""记录当前算法的执行状态,特别地设置地址栈,用来记录当前算法的执行位置,以备回溯时正常返回。递归模块的形式参数是普通变量,每次递归调用得到的值都是不同的,他们也是由""来存储。 
(3) 递归调用的几种形式 
    一般递归调用有以下几种形式(其中a1a2b1b2k1k2为常数)。 
   <1> 直接简单递归调用: f(n) {...a1 * f((n - k1) / b1); ...}; 
    
   <2> 直接复杂递归调用: f(n) {...a1 * f((n - k1) / b1); a2 * f((n - k2) / b2); ...}; 
    <3> 间接递归调用:  f(n) {...a1 * f((n - k1) / b1); ...}, 
                        g(n) {...a2 * f((n - k2) / b2); ...}。 

2. 递归算法效率分析方法 

   递归算法的分析方法比较多,最常用的便是迭代法。 
  迭代法的基本步骤是先将递归算法简化为对应的递归方程,然后通过反复迭代,将递归方程的右端变换成一个级数,最后求级数的和,再估计和的渐进阶。 
  <1> 例:n! 
       算法的递归方程为: T(n) = T(n - 1) + O(1); 
       迭代展开: T(n) = T(n - 1) + O(1) 
                       = T(n - 2) + O(1) + O(1) 
                       = T(n - 3) + O(1) + O(1) + O(1) 
                       = ...... 
                       = O(1) + ... + O(1) + O(1) + O(1) 
                       = n * O(1) 
                       = O(n) 
      这个例子的时间复杂性是线性的。 
<2> 例:如下递归方程: 
      
      T(n) = 2T(n/2) + 2, 且假设n=2k次方。 
      T(n) = 2T(n/2) + 2 
           = 2(2T(n/2*2) + 2) + 2 
           = 4T(n/2*2) + 4 + 2 
           = 4(2T(n/2*2*2) + 2) + 4 + 2 
           = 2*2*2T(n/2*2*2) + 8 + 4 + 2 
           = ... 
           = 2(k-1)次方 * T(n/2(i-1)次方) + $(i:1~(k-1))2i次方 
           = 2(k-1)次方 + (2k次方)  - 2 
           = (3/2) * (2k次方) - 2 
           = (3/2) * n - 2 
           = O(n) 
      这个例子的时间复杂性也是线性的。 
<3> 例:如下递归方程: 
      
      T(n) = 2T(n/2) + O(n), 且假设n=2k次方。 
      T(n) = 2T(n/2) + O(n) 
           = 2T(n/4) + 2O(n/2) + O(n) 
           = ... 
           = O(n) + O(n) + ... + O(n) + O(n) + O(n) 
           = k * O(n) 
           = O(k*n) 
           = O(nlog2n) //2为底 
     
      一般地,当递归方程为T(n) = aT(n/c) + O(n), T(n)的解为: 
      O(n)          (a<c && c>1) 
      O(nlog2n)     (a=c && c>1) //2为底 
      O(nlogca)     (a>c && c>1) //n(logca)次方,以c为底 
   上面介绍的3种递归调用形式,比较常用的是第一种情况,第二种形式也有时出现,而第三种形式(间接递归调用)使用的较少,且算法分析 
比较复杂。 下面举个第二种形式的递归调用例子。 
  <4> 递归方程为:T(n) = T(n/3) + T(2n/3) + n 
     为了更好的理解,先画出递归过程相应的递归树: 
                            n                        --------> n 
                    n/3            2n/3              --------> n 
              n/9       2n/9   2n/9     4n/9         --------> n 
           ......     ......  ......  .......        ...... 
                                                     -------- 
                                                     总共O(nlogn) 
     累计递归树各层的非递归项的值,每一层和都等于n,从根到叶的最长路径是: 
    
      n --> (2/3)n --> (4/9)n --> (12/27)n --> ... --> 1 
     设最长路径为k,则应该有: 
      
     (2/3)k次方 * n = 1 
     得到 k = log(2/3)n  // (2/3)为底 
     于是 T(n) <= (K + 1) * n = n (log(2/3)n + 1) 
     即 T(n) = O(nlogn) 
    由此例子表明,对于第二种递归形式调用,借助于递归树,用迭代法进行算法分析是简单易行的。
递归函数时间复杂度分析 递归函数时间复杂度分析-----------------------(1) 递归执行过程 阅读详情

相关推荐

计算机考研408每日题 day13

设计一个递归函数按 n!=n*(n-1)计算n!,则其时间复杂度为___(南开大学2013)采用下列哪种传输方式,由网络负责差错控制和流量控制,分组按顺序被递交。 周期挪用常用于___(北京航空航天大学2017) 操作系统的两个最主要的特征是__(北京交通大学)

漫磋嗟 744

递归函数求解——利用主方法

注意,本文编辑使用了latex语法,可以参考常用数学符号表示法latex帮助。 1. T(n)=T(n/2)+c 解:替换法 到这里假设,则上式等于 2. T(n)=4T(n/2)+n 解:主方法,a=4,b=2,f(n)=n, 因此,可知,满足主方法第条定理 所以 3. T(n)=4T(n/2)+c 解:替换法 到这里假设,则上式等于,如果T(1)=1,则有 4. ...

woshilsh的博客 3674

如何评估递归算法的复杂度

如何评估递归算法的复杂度 整理如下表 掌握时间复杂度细则可以更好的优化代码性能 递归关系 结果 举例 f(n)=f(n/2)+O(1) O(logn) 二分查找,欧几里得gcd – – – f(n)=f(n-1)+O(1) O(n) 线性查找 – – – f(n)=2f(n/2)+O(n) O(n logn),快排 – – – f(n)=2f(n/2)...

kexiaoboy的博客 330

时间复杂度

时间复杂度

onemoreoffer的博客 1556

由“斐波那契数列”问题调用递归函数引发的思考

对于输入N,函数Fib(N)会调用Fib(N-1)和Fib(N-2)。这两个调用是独立的,且每个调用都会进步产生两个新的调用,依此类推。这种递归结构可以看作是棵二叉树,树的每个节点代表一个函数调用。树的深度等于输入N。在二叉树中,节点的数量是指数级的。具体来说,对于深度为N的树,节点的数量是2^N。每个节点都需要执行定的计算(加法和减法),因此总体的时间复杂度是O(2^N)。空间复杂度通常考虑的是程序运行时所需要的额外空间,不包括存储输入本身的空间。

StockholmLover的博客 495

武汉大学数据结构MOOC第6周测验

1单选(2分)一个正确的递归算法通常包含( )。 A.递归出口 B.递归体 C.递归出口和递归体 D.以上都不包含 正确答案:C 解析: C、正确的递归算法应包含递归出口和递归体两部分,缺不可。 2单选(2分)递归函数f(x,y)定义如下: f(x,y)=f(x-1,y)+f(x,y-1) 当x>0且y>0 f(x,y)=x+y 否则 则f(2,1)是( )。 A.1 B.2 C.3 D.4 正确答案:D 解析: D、f(2,1)=f(1

猪脚王的博客 1984

牛客不牛

LH250 1.T(n) = 25T(n/5)+n^2的时间复杂度? A. O(n^2*(lgn)) B. O(n^2) C. O(lgn) D. O(nnn) 什么鬼,这都有公式??还想写解析,记住完事了 2.连续自然数之和为1000的共有几组?(m,n都为自然数,单独1个数也算作“连续自然数”) 这题哦,牛客大佬们数学功底暴露了,连推荐的最佳解析都是错的,hhh~ 1000=(2^3)(5^...

这里只有黑里 274

Master公式

Master公式

yw_2022的博客 109

如何分析一个算法时间复杂度

直以来,分析一个算法时间复杂度对我而言都是很头疼的。直到今天又拿起数据结构算法时间复杂度就是一个算法执行次数的量级,而量级就是多项式的最高次幂。假如代码的执行次数是n(n+1)/2,那最高次幂是n^2,那么多项式的量级就是n方,代码的时间复杂度就是O(n ^2) 那么如果看算法的执行次数呢?几个题就说明白了。 代码块1: for(int i=0;i<10;i++) i++; 上...

HFish24的博客 9741

递归算法中的时间复杂度分析

递归算法中的时间复杂度分析 对于算法时间复杂度分析还是特别重要的,在些非递归算法中,我们仅仅看运算次数最多的那行代码可能执行多少次就可以,实际就是看在循环中变量的变化,但是对于递归算法中该怎么分析呢?下面介绍几种递归函数中的算法时间复杂度分析的方法 0.递推法 这种方法是最简单的,也是最容易理解的种方法,对于一个递归函数,我们可以利用他的递归方程,将其递推到常量的情况下,这样子就很容易求解他的时间复杂度了,可以看下下面的递归方程 T(n){1n=12T(n−1)+1n>0 T(n)\

ghsticker的博客 1万+

算法时间复杂度分析

算法时间复杂度分析 & 递归函数时间复杂度分析算法时间复杂度分析1.算法耗费的时间、语句频度、输入规模 在实际中,一个算法所需耗费的时间 = 算法中所有语句的执行时间之和 而, 每条语句的执行时间= 每条语句执行次所需时间 * 每条语句的执行次数(语句频度);因为每条语句执行次所需时间取决于机器执行指令的性能、速度等难以确定的因素,而为了独立于机器的软、硬件系统来分析算法

Chaoer 6151

递归时间复杂度怎么算_举弄懂递归函数时间复杂度

对于计算机科学来说,算法至关重要。通俗地讲,算法是指解决问题的种方法一个过程。严格来讲,算法是由若干条指令组成的有序序列,且满足以下4条性质:1.输入2.输出3.确定性4.有限性算法复杂度的高低体现在运行该算法时所需要的计算机资源的多少上,所需资源越多,算法的复杂度越高,也就称这个算法较差。因此,算法的复杂度分为时间复杂度和空间复杂度。由于空间复杂度是具体算法具体分析,因此这里我们简单谈谈...

weixin_39811150的博客 5799

(三)递归函数复杂度分析——算法设计分析

本文介绍4种递归函数时间复杂度的求解方法:迭代展开、变量代换、Master定理、先猜后证。

友人帐_的博客 1955

递归函数时间、空间复杂度分析

递归函数时间、空间复杂度分析

qq_45009947的博客 2632

分析时间复杂度(1)

目录 、度量 1.1 定义 1.2 思路 二、实战 2.1 例 2.2 例二求n!的递归函数时间复杂度 2.3 例三  、度量 1.1 定义 将算法中基本操作的执行次数作为算法时间复杂度的度量。这里所讨论的时间复杂度不是执行完段程序的总时间,而是其中基本操作的总次数。这很好理解:程序运行环境不同,运行的总时间是不同的,正如在银河系列巨型计算机和普通的个人用计算机运行同...

仰望星空 3230

分析递归函数时间复杂度

递归算法时间复杂度表达式: O(T) = R * O(s) O(T)表示时间复杂度 R表示递归调用的次数 O(s)每次递归调用计算时间复杂度 想想斐波那契函数,它的递归关系是f(n) = f(n-1) + f(n-2);乍看,我们会发现,在斐波那契函数执行期间来计算递归调用的次数似乎不那么的容易。 解释:这种情况下,我们最好是可以借助执行树,它是颗被用来表示递归函数执行流程的数。树中的每一个节点代表递归函数次调用。所以,树中节点的总数与执行期间递归调用的数量相对应。 递

红目香薰 1381

素数的时间复杂度分析

找出素数的四种方法: 复杂度 主要区别 1. 时间复杂度:O(n2) divisor <= Math.sqrt(number) 2. 时间复杂度:O(n√n) divisor <= squareRoot,其中squareRoot2 <number 3. 时间复杂度:O(n√n / logn) for (int k=0; k<list.size() && list.get(k) <= squareRoot ;k++){…} 4. 时

qq_34358193的博客 3635
上一篇: 算法的时间复杂度和空间复杂度-总结
下一篇: 递归函数时间复杂度分析二
shanshanhi
博客等级 码龄11年 48粉丝 152原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值