`
radovi
  • 浏览: 64602 次
  • 性别: Icon_minigender_1
  • 来自: 杭 州
社区版块
存档分类
最新评论

递归有好有坏的……

阅读更多
   迭代和递归,各有各的好,在我看来,递归好了程序员,害了电脑,而迭代相反,他要求程序员为程序考虑的很多,运行起来就会好很多。
举个例子 斐波那契数吧
以下是分别用两者实现的。请比较
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产个四核了……
分享到:
评论
8 楼 picora 2009-03-25  
汉诺塔用迭代要怎么写?
7 楼 radovi 2009-03-23  
Element&lina 写道
lz例子跟要说明的意图容易产生误解


何以见得,请不吝赐教
6 楼 Element&lina 2009-03-23  
lz例子跟要说明的意图容易产生误解
5 楼 leeldy 2009-03-23  
递归是很方便程序员思考的,思路非常的清晰,但是资源浪费很严重
而迭代是相当高效的计算方法。
我推崇的方式就是用递归来思考问题,然后寻找是否有可能由递归方法转换成用迭代的方法来解决。
4 楼 unsid 2009-03-23  
递归有一个很大的优势:递归的过程往往是自描述的,而迭代则往往需要外部的指令,比如迭代次数.递归是自己检测到停止,而迭代"我告诉你什么时候停,你就什么时候停",所以在一些自适应的系统里,无法得到外部的指令(迭代次数),则只能用递归.还有很多函数式语言(比如Erlang),这些语言是不允许改变变量值的,所以无法通过指令式的方式进行,只能用递归.
3 楼 groovyzhou 2009-03-23  
"迭代和递归,各有各的好,在我看来,递归好了程序员,害了电脑,而迭代相反,他要求程序员为程序考虑的很多,运行起来就会好很多。 "
也未必。就看程序怎么写了
2 楼 akiraray 2009-03-23  
个人感觉 递归更接近于数学思维……迭代更接近于计算机思维
1 楼 xqh1022 2009-03-23  
我是sf。。。。。。。。。。。。

相关推荐

    计算fibonacci数列每一项时所需的递归调用次数.pdf

    ### 计算Fibonacci数列递归调用次数 #### Fibonacci数列简介 Fibonacci数列是一个经典的数学概念,在计算机科学、金融学、生物学等多个领域都有广泛...通过递归树分析和优化算法,可以更好地理解和改进这一计算过程。

    二叉排序树与平衡二叉树的实现

    5 调试分析………………………………………………………………………… 14 5.1 时间复杂度的分析………………………………………………………………14 5.2 运行结果…………………………………………………………...

    C++常用排序法:冒泡 选择 快速 希尔……

    希尔排序的时间复杂度取决于增量序列的选择,但通常比简单的插入排序有更好的性能。 除了以上提到的排序算法,还有其他如归并排序、堆排序等高级排序算法,它们的时间复杂度同样为O(NlogN),但在实际应用中各有优...

    计算机算法设计与分析复习题与答案2.docx

    回溯法:问题的解可以表示为 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项,但是递归实现的时间复杂度较高,可以优化为动态规划...

    6.快速排序.ppt

    快速排序在实际编程中通常会有一些优化措施,比如三数取中法选择基准值,以减少最坏情况的发生概率;或者使用尾递归优化,减少递归深度,提高效率。 总之,快速排序因其高效的性能和简洁的实现,成为了许多软件公司...

    C语言面试题,附有答案

    do……while和while……do有什么区别? - `do...while`循环至少会执行一次,然后检查条件。 - `while...do`循环先检查条件,满足条件才执行循环体。 #### 21. 请写出下列代码的输出内容 ```c #include int main...

    NOIP2018普及组C++试题.pdf

    10. 算法实例:递归算法在故事中的实际应用,例如“从前有座山,山里有座庙……”的故事结构。 11. 简单无向连通图的个数:由四个无区别的点构成的简单无向连通图的总数。 12. 集合子集数的计算:含有10个元素的...

    WinRAR 简体中文注册版 3.90 Beta1 修正2

    WINRAR 是现在最好的压缩工具,界面友好,使用方便,在压缩率和速度方面都有很好的表现。其压缩率比之 WINZIP 之流要高。RAR 采用了比 Zip 更先进的压缩算法,是现在压缩率较大、压缩速度较快的格式之一。 主要特点...

    排序的算法

    直插排序是一种简单直观的排序算法,其基本思想是将一个记录插入到已经排好序的有序序列中,从而得到一个新的、记录增1的有序序列。算法步骤如下: 1. 将数组分为已排序部分和未排序部分。 2. 从未排序部分取出第一...

    数据结构(C++)有关练习题

    3、 请用C++编写一个算法,完成矢量的加法与成法运算,运算规则如下: a. 矢量加法:(a1,a2,……,an)+(b1,b2,……,bn)=(a1+b1,a2+b2,……,an+bn); b. 矢量减法:(a1,a2,……,an)-(b1,b2,……,bn)=(a1-b1,...

    趋势2014夏令营笔试题

    - **统计信息更新**:定期更新统计信息有助于优化器做出更好的执行计划选择。 - **存储引擎选择**:根据不同的应用场景选择合适的存储引擎也能提升性能。 ### TCP/IP知识点 #### 3. 网际层协议 - **问题**: ...

    数据结构期末考试真题

    ### 数据结构期末考试知识点解析 #### 一、计算题 (63分) ##### 1....为什么?并图示之。(8分) ...- 主定理适用于形如 T(n) = aT(n/b) + f(n) 的递归公式,其中 a ≥ 1,b &gt; 1 且 f(n) 为某个函数。 -...

    算法设计与分析(第二版)王红梅,胡明 第一章课后答案

    **概念**:更相减损术是一种求解两个自然数最大公约数的方法,其核心思想是利用两数之间的差值递归地缩小问题规模直至问题解决。 **伪代码**: ```plaintext 输入:两个自然数 m 和 n 输出:m 和 n 的最大公约数 1....

    提高组CSP-S第二套模拟试题模拟题附答案

    - **操作规律分析:** 对于题目中给出的操作序列“进栈、进栈、出栈、进栈、进栈、进栈、出栈……”,可以看出每次操作后栈顶元素的变化规律。 **应用示例:** - 题目给出了一个特定的操作序列,并询问经过2019次...

    计算机二级公共基础知识

    如果从根结点开始,按层次(每一层从左到右)用自然数1,2,……,n给结点进行编号,则对于编号为k(k=1,2,……,n)的结点有以下结论: ① 若k=1,则该结点为根结点,它没有父结点;若k&gt;1,则该结点的父结点编号...

Global site tag (gtag.js) - Google Analytics