递归算法时间复杂度

引言:时间复杂度的求解,在此都是以实例进行讲解,各位读者可以从中慢慢理解;以下所有的案例都是以Python语言编写!

案例一:求a的n次方

代码如下:

def exp1(a,n):

if n == 1:

return a

else:

return a*exp2(a,n-1)

分析:1、问题的规模是n;2、当规模为1是结束;3、假设T(n)表示规模为n的问题所需的步骤数;

求解:

T(n)=3+T(n-1)//注释:3表示一次循环中所做的操作数,一次是if的比较“==”,二次是递归中的n-1中的“-”,三次是a*exp1(a,n-1)中的“*”,规模每减少一次,就进行上述三次操作。

分解:T(n)=3+3+T(n-2)

=3+3+3+T(n-3)

......

=3*K+T(n-K)

当规模为1时返回结果,即n-K=1-》K=n-1,将K带入T(n)

T(n)=3(n-1)+T(1)=3n-3+2=3n-1//注释:T(1)时规模为1,进行了两次操作。

综上:上述程序时间复杂度为:O(n)

时间: 2024-10-03 21:54:16

递归算法时间复杂度的相关文章

递归算法时间复杂度----汉诺塔

问题:汉诺塔递归算法时间复杂度 算法如下: 解释:size表示汉诺塔的规模,startStack表示汉诺塔起始,endStack 表示完成,midStack表示辅助 def Towers(size,startStack,endStack,midStack): if size == 1: print 'Move disk from ', firstStack, 'to ', endStack else: Towers(size-1,firstStack,midStack,endStack) Tow

递归算法时间复杂度分析与改善

递归算法大家都不陌生,当需要重复计算相同问题时,一般可以选择递归和循环两种算法.又因为递归实现起来代码比较简洁,所以通常都会使用递归来解决上述问题.比如斐波那契数列,再比如树的前序.中序.后续遍历算法. 递归算法虽然是有代码简洁这个优点,但是其缺点显著.因为递归函数是在执行过程中调用其自身,所以会占用大量的栈上空间,并且压栈和出栈都是有时间消耗的.所以从这一点上来看,递归的效率是不如循环.除了效率之外,递归还有一个相当明显的问题:可能会导致栈溢出.当递归调用的次数过大时,很有可能会出现栈溢出的情

(转)递归树求递归算法的时间复杂度

本文转载:http://www.cnblogs.com/wu8685/archive/2010/12/21/1912347.html 递归算法时间复杂度的计算方程式一个递归方程: 在引入递归树之前可以考虑一个例子: T(n) = 2T(n/2) + n2 迭代2次可以得: T(n) = n2 + 2(2T(n/4) + (n/2) 2) 还可以继续迭代,将其完全展开可得: T(n) = n2 + 2((n/2) 2 + 2((n/22)2 + 2((n/23) 2 + 2((n/24) 2 +-

斐波那契数与二分法的递归与非递归算法及其复杂度分析

1. 什么是斐波那契数? 这里我借用百度百科上的解释:斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字来说,就是斐波那契数列列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加.特别指出:0不是第一

大O和数据的规模

1.O(f(n)) 学术界:O表示算法执行的上界,例如,归并算法的时间复杂度可以是O(nlogn),同时也是O(n^2)的 业界认为:O表示算法执行的最低上界,归并算法的时间复杂度是O(nlogn) 2.一个时间复杂度问题 一个字符串数组,将一每个字符串进行字母序排序,然后将字符串数组进行字典序排序的时间复杂度 n:数组长度  s:最大的字符串长度 O = s*nlogn (字符串数组排序)+ n* slogs(每个字符串) 3.数据规模 : 1S内可以处理的数据规模 O(N^2) :10^3~

递归和非递归方法实现斐波那契

斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci[1]  )以兔子繁殖为例子而引入,故又称为"兔子数列",指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.--.在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在现代物理.准晶体结构.化学等领域,斐波纳契数列都有直接的应用. 斐波那契递归算法实现.

C#完美实现斐波那契数列

/// <summary>        /// Use recursive method to implement Fibonacci        /// </summary>        /// <param name="n"></param>        /// <returns></returns>        static int Fn(int n)        {            if 

动态规划算法(java)

一.动态规划算法 众所周知,递归算法时间复杂度很高为(2^n),而动态规划算法也能够解决此类问题,动态规划的算法的时间复杂度为(n^2).动态规划算法是以空间置换时间的解决方式,一开始理解起来可能比较困,自己画画也许明白了很多. 二.动态规划算法分析 先举个例子: {7,0,0,0,0},{3,8,0,0,0},{8,1,0,0,0},{2,7,4,4,0},{4,5,2,6,5} 这个二维数组,求一下,顶层到底层,只能通过两端来相加的最大值(也就是说这棵树的最长路径). 分析: (1)第一步:

268.和算法执行时间相关的因素

1.决定因素 1.1算法选用的策略 1.2问题的规模 1.3编写程序的语言 1.4编译程序产生的机器代码的质量 1.5计算机执行指令的速度 2.其他影响元素 3.问题的规模(时间复杂度) 3.1定义 一个特定算法的“运行工作量”的大小,?只依赖于问题的规模(通常用整数量n表示),?或者说,它是问题规模的函数.?? 假如,随着问题规模 n 的增长,算法执行时间的增长率和 f(n) 的增长率相同,?则可记作:T (n) = O(f(n)), 称T (n) 为算法的(渐近)时间复杂度.??? 一个算法