在算法中,时间复杂度是衡量一个算法好坏的重要标准。
递归调用在算法中可以非常直观有效的解决我们的问题,但是由于其调用的时候需要花大量的时间,所以我们一般都会刻意的避免使用递归去完成我们的算法。
在这里,我就用斐波那契数列的递归构造和非递归构造来分析递归和非递归的时间复杂度。
先看具体的代码极其运行的时间:
/*
* 比较递归和非递归求斐波那契数的时间效率
* @version 2012/5/7
* @author akon
*/
package com.akon405.www;
public class Fibonacci {
//递归求斐波那契数列
public int rFibonacci(int n){
int x=n;
if(x<=1){
return x;
}
x=rFibonacci(x-1)+rFibonacci(x-2);
return x;
}
//非递归求斐波那契数列
public int uRFibonacci(int n){
int x=1;
int y=1;
int tmp;
for(int i=2;i<n;i++){
tmp=x;
x=y;
y=y+tmp;
}
return y;
}
public static void main(String[] args) {
double d1,d2,d3;
Fibonacci f=new Fibonacci();
System.out.println("递归求斐波那契数列:");
d1=System.currentTimeMillis();
for(int i=1;i<=40;i++){
System.out.println(f.rFibonacci(i));
}
d2=System.currentTimeMillis();
d3=d2-d1;
System.out.println("递归求斐波那契数列的时间:"+d3);
System.out.println("非递归求斐波那契数列:");
d1=System.currentTimeMillis();
for(int i=1;i<=40;i++){
System.out.println(f.uRFibonacci(i));
}
d2=System.currentTimeMillis();
d3=d2-d1;
System.out.println("非递归求斐波那契数列的时间:"+d3);
}
}
运算结果:(只保留部分结果)
递归求斐波那契数列:
1
1
2
3
5
.
.
102334155
递归求斐波那契数列的时间:4322.0
非递归求斐波那契数列:
1
1
2
3
5
.
.
102334155
非递归求斐波那契数列的时间:3.0
通过结果就可以大致看出,递归调用的时间是非递归调用的很多倍。并且这种情况在n越大的时候越明显。
在分析算法的时间复杂度的时候,我们也可以得到相同的结果,非递归使用的是for循环,其时间复杂度为O(n)。而递归的时间复杂度则比较复杂,其分析出来为O(2^n)。
这里需要说明的就是,非递归的for循环其时间复杂度O(n)虽然很小,但是其空间复杂度缺比递归调用差得多。因为,for循环在每次循环的时候,都把相应的数值保存下来了,而递归调用却不会保存相应的数值。
分享到:
相关推荐
这个数列由意大利数学家斐波那契(Leonardo Fibonacci)在13世纪引入,用于模拟兔子繁殖的问题,因此也被称为“兔子数列”。数列的定义非常简单:第一项是0,第二项是1,之后每一项都是前两项之和。用数学公式表示...
数论选讲--李学武_(Fibonacci数列_佩尔方程) 本资源摘要信息涵盖了数论选讲的重要知识点,包括二元一次不定方程、佩尔方程、Fibonacci数列等。下面是详细的知识点解释: 一、求解二元一次不定方程 对于二元一次...
"Fibonacci数列斐波那契数列PPT学习教案.pptx" Fibonacci数列是一种非常重要的数学概念,它的应用非常广泛,包括生物学、经济学、计算机科学等领域。下面我们将详细介绍Fibonacci数列的概念、性质和应用。 1. ...
利用数组计算斐波那契数列
填空8-1 采用递归思想求斐波那契数列.py
程序分析:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、…… 在数学上,费波那契数列是以递归的方法来定义: F0 = 0 (n=0) F1 = 1 (n=1) Fn ...
斐波那契数列是计算机科学中一个经典的问题,它在算法设计和分析中具有重要的地位。这个压缩包包含两个C++源程序,分别使用递归法和非递归法来实现斐波那契数列的计算。接下来,我们将详细讨论这两个方法以及...
斐波那契数列(Fibonacci sequence)是数学中一个非常著名的数列,其特点是每一项数值都是前两项数值的和。通常情况下,斐波那契数列的第一项为0或1,第二项也为1,后续各项则根据定义递推得到。 **基本形式:** \...
它们常用于性能测试,如计算大数目的斐波那契数以分析算法的时间复杂度。同时,斐波那契数列的特性也被应用于优化问题,比如记忆化搜索或动态规划,以减少重复计算。 在实际问题中,斐波那契数列能帮助解决各种各样...
汇编语言-输出斐波那契数列前N项汇编语言-输出斐波那契数列前N项汇编语言-输出斐波那契数列前N项汇编语言-输出斐波那契数列前N项汇编语言-输出斐波那契数列前N项汇编语言-输出斐波那契数列前N项汇编语言-输出...
一 生小兔问题引起的二 它们也产生斐波那契数列三 通项的其他表达式四 斐波那契数列是二阶循环数列五 斐波那契数列的数论性质六 斐波那契数列的其他性质七 某些斐波那契数列之和八 斐波那契数列与连分数九 斐波那契...
c++ c++_剑指offer题解之斐波那契数列
// 给定一个正整数N, 其中 // N = A1 + A2 + ... + An 其中A1, A2, ..., An...// -> 斐波那契数列的值为: 1, 1, 2, 3, 5, 8, 13, 21, 34, .... // Ex input 11 -> output [8, 3] // Ex input 31 -> output [21, 8, 2]
斐波那契数列: 在数学上它以递归的方式进行定义,指这样的一个数列:0、1、1、2、3、5、8、13、21、34、55、89、144……,即前两个数为分别为0和1,从第3项开始,每项的值都等于其前两项之和。斐波那契数列Fib(n)用...
斐波那契数列是一个经典的数学概念,在计算机科学中经常被用作算法和数据结构的基础。这个数列的每一项都是前两项的和,通常以0和1开始,即F(0) = 0,F(1) = 1。对于n > 1,F(n) = F(n-1) + F(n-2)。K阶斐波那契数列...
本文档介绍了一个基于斐波那契数列的指标,用于股票市场的技术分析。该指标结合了指数移动平均线(EMA)和斐波那契数列,旨在帮助投资者更好地分析和预测股票市场的走势。 斐波那契数列是一种数学序列,其中每个...
3. **数据分析**:斐波那契数列与黄金分割比例有关,可以用于分析数据模式,比如在图像处理、音乐创作、金融分析等领域。 4. **算法教学**:斐波那契数列常被用作教学示例,帮助初学者理解递归、循环等基础编程概念...
本代码使用C++语言书写,编译环境VS2013。...斐波那契数列(Fibonacci Sequence)又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、…… 本代码是练习作品,如有错误或修改,请指正,感谢感谢。
斐波那契数列是一个经典的数学概念,由意大利数学家斐波那契在13世纪提出,数列中的每一项都是前两项之和。在数列的开始,第一项是0,第二项是1,之后的每一项都等于前两项之和。斐波那契数列的前几项通常是:0, 1, ...
"斐波那契数列算法分析" 斐波那契数列是一种非常经典的数学概念,它的应用非常广泛,包括算法设计、生物学、经济学等领域。斐波那契数列的定义是:每个数都是前两个数的和,从第三个数开始,每个数都是前面两个数的...