迭代和递归,各有各的好,在我看来,递归好了程序员,害了电脑,而迭代相反,他要求程序员为程序考虑的很多,运行起来就会好很多。
举个例子 斐波那契数吧
以下是分别用两者实现的。请比较
package chap18;
import java.util.Scanner;
//用递归法是实现的斐波那契数
public class febo {
/**
* @param args
*/
public static void main(String[] args) {
while(true)
{
System.out.println("请输入你要计算的那项");
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
MyTimer myTimer = new MyTimer();
myTimer.start();
System.out.println(feibo(n));
myTimer.end();
System.out.println("用时 "+myTimer.getUseTime()+"毫秒");
}
}
/*
* 斐波那契方法
* @param n 要求的那项位置
* @return 结果
*/
public static int feibo(int n)
{
if(n <= 2)
return 1;
else
{
return feibo(n-1)+feibo(n-2);
}
}
}
运行结果:
请输入你要计算的那项
40
102334155
用时 1500毫秒
请输入你要计算的那项
package chap18;
import java.util.Scanner;
/*
* 采用迭代方法解决的斐波那契数列
*/
public class feibo1 {
/**
* @param args
*/
public static void main(String[] args) {
while(true)
{
System.out.println("请输入你要计算的那项");
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
MyTimer myTimer = new MyTimer();
myTimer.start();
System.out.println(feibo(n));
myTimer.end();
System.out.println("用时 "+myTimer.getUseTime()+"毫秒");
}
}
/*
* 斐波那契方法 采用迭代方法解决
* @param n 要求的那项位置
* @return 结果
*/
public static int feibo(int n)
{
int start1 = 1;
int start2 = 1;
for(int i = 2; i < n; i++)
{
int temp = start1+start2;
start1 = start2;
start2 = temp;
}
return start2;
}
}
运行结果:
请输入你要计算的那项
40
102334155
用时 0毫秒
请输入你要计算的那项
还有啊,开个玩笑,如果把n取到50(不用很大,50足矣),用第一种,只有指望intel产个四核了……
分享到:
- 2009-03-22 22:13
- 浏览 1325
- 评论(8)
- 论坛回复 / 浏览 (6 / 2930)
- 查看更多
相关推荐
### 计算Fibonacci数列递归调用次数 #### Fibonacci数列简介 Fibonacci数列是一个经典的数学概念,在计算机科学、金融学、生物学等多个领域都有广泛...通过递归树分析和优化算法,可以更好地理解和改进这一计算过程。
5 调试分析………………………………………………………………………… 14 5.1 时间复杂度的分析………………………………………………………………14 5.2 运行结果…………………………………………………………...
希尔排序的时间复杂度取决于增量序列的选择,但通常比简单的插入排序有更好的性能。 除了以上提到的排序算法,还有其他如归并排序、堆排序等高级排序算法,它们的时间复杂度同样为O(NlogN),但在实际应用中各有优...
回溯法:问题的解可以表示为 n 元组:(x1,x2,……xn),xi∈Si, Si 为有穷集合,xi∈Si,(x1,x2,……xn)具备完备性,即(x1,x2,……xn)是合理的,则(x1,x2,……xi)(i)一定合理。 回溯法的搜索特点:在解空间树...
- **基本思想**:直接插入排序假设数组的前`i`个结点序列`a1, a2, ……, ai-1`是已经排序好的,称为有序区,`i`后面的`n-i+1`个序列`ai, ai+1, ……, an`是无序区。对结点`ai`在这有序结点列中找插入位置,并将`ai`...
- **定义**:费式数列是指这样一个序列:0, 1, 1, 2, 3, 5, 8, 13, …… 其中每一项都是前两项的和。 - **递归实现**:可以通过递归的方式来计算费式数列的第n项,但是递归实现的时间复杂度较高,可以优化为动态规划...
快速排序在实际编程中通常会有一些优化措施,比如三数取中法选择基准值,以减少最坏情况的发生概率;或者使用尾递归优化,减少递归深度,提高效率。 总之,快速排序因其高效的性能和简洁的实现,成为了许多软件公司...
do……while和while……do有什么区别? - `do...while`循环至少会执行一次,然后检查条件。 - `while...do`循环先检查条件,满足条件才执行循环体。 #### 21. 请写出下列代码的输出内容 ```c #include int main...
10. 算法实例:递归算法在故事中的实际应用,例如“从前有座山,山里有座庙……”的故事结构。 11. 简单无向连通图的个数:由四个无区别的点构成的简单无向连通图的总数。 12. 集合子集数的计算:含有10个元素的...
WINRAR 是现在最好的压缩工具,界面友好,使用方便,在压缩率和速度方面都有很好的表现。其压缩率比之 WINZIP 之流要高。RAR 采用了比 Zip 更先进的压缩算法,是现在压缩率较大、压缩速度较快的格式之一。 主要特点...
直插排序是一种简单直观的排序算法,其基本思想是将一个记录插入到已经排好序的有序序列中,从而得到一个新的、记录增1的有序序列。算法步骤如下: 1. 将数组分为已排序部分和未排序部分。 2. 从未排序部分取出第一...
3、 请用C++编写一个算法,完成矢量的加法与成法运算,运算规则如下: a. 矢量加法:(a1,a2,……,an)+(b1,b2,……,bn)=(a1+b1,a2+b2,……,an+bn); b. 矢量减法:(a1,a2,……,an)-(b1,b2,……,bn)=(a1-b1,...
- **统计信息更新**:定期更新统计信息有助于优化器做出更好的执行计划选择。 - **存储引擎选择**:根据不同的应用场景选择合适的存储引擎也能提升性能。 ### TCP/IP知识点 #### 3. 网际层协议 - **问题**: ...
### 数据结构期末考试知识点解析 #### 一、计算题 (63分) ##### 1....为什么?并图示之。(8分) ...- 主定理适用于形如 T(n) = aT(n/b) + f(n) 的递归公式,其中 a ≥ 1,b > 1 且 f(n) 为某个函数。 -...
**概念**:更相减损术是一种求解两个自然数最大公约数的方法,其核心思想是利用两数之间的差值递归地缩小问题规模直至问题解决。 **伪代码**: ```plaintext 输入:两个自然数 m 和 n 输出:m 和 n 的最大公约数 1....
- **操作规律分析:** 对于题目中给出的操作序列“进栈、进栈、出栈、进栈、进栈、进栈、出栈……”,可以看出每次操作后栈顶元素的变化规律。 **应用示例:** - 题目给出了一个特定的操作序列,并询问经过2019次...
如果从根结点开始,按层次(每一层从左到右)用自然数1,2,……,n给结点进行编号,则对于编号为k(k=1,2,……,n)的结点有以下结论: ① 若k=1,则该结点为根结点,它没有父结点;若k>1,则该结点的父结点编号...