`
radovi
  • 浏览: 64276 次
  • 性别: 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。。。。。。。。。。。。

相关推荐

    数据结构与算法

    第 章 递归…………………………… 递归的概念 …………………… 递归程序设计………………… 分治与递归 ………………… 动态规划 …………………… 回溯与递归 ………………… 模拟递归 ……………………… 应用 ...

    c++递归c++递归c++递归

    c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘...

    宏递归宏递归宏递归宏递归

    宏递归宏递归宏递归宏递归宏递归宏递归宏递归宏递归宏递归宏递归

    C#递归 C#递归 C#递归

    C#递归C#递归C#递归C#递归C#递归C#递归C#递归C#递归C#递归

    数据结构课程设计八皇后的求解

    5.1.1、递归介绍…………………………………………………………………………7 5.1.2、使用到的函数和变量……………………………………………………………8 5.1.3、具体运行结果…………………………………………...

    .net 递归算法 .net 递归算法.net 递归算法

    .net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法

    文件递归-XML递归-树图递归

    文件递归-XML递归-树图递归 面试中的常见递归算法:附带截图和详细代码

    递归和非递归方式计算Ackerman函数

    递归和非递归方式计算Ackerman函数。非递归方法用堆栈实现。代码内部有详细的注释说明,比较适于学习。

    快速选择非递归与递归算法实现

    快速选择非递归与递归算法实现

    n后问题---递归回溯法 n后问题---递归回溯法

    n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---...

    递归应用C语言实现

    包含多个经典的递归应用代码: 1.fibonacci.c 是斐波拉契数列递归解法 2.hanoi.c 是汉诺塔递归算法 3.permutation.c 是全排列递归算法 4.queen.c 是八皇后递归算法 5. reverse.c 是递归的测试代码 6.strlrn.c 是求...

    ackermann函数的递归实现和非递归实现

    ackman函数的递归和非递归,学习数据结构的素材,非递归是使用堆栈实现的。

    递归实现汉诺塔

    1、此程序为汉诺塔程序(此代码用到递归,包括直接递归和间接递归(间接递归是用在了重复使用本程序那块)); 2、此程序的代码流程是,由main函数进入之后,先后调用的函数是由上至下定义的; 3、亲爱的朋友,请...

    c++合并排序算法递归与非递归方式

    c++实现的合并排序算法 用递归和非递归两种方式实现的

    C++二叉树非递归以及递归算法

    包含一下方法: 1.通过一个数组来构造一颗二叉树 2.通过一个数组来构造一颗完全二叉树 3.使用递归 先序遍历一棵二叉树 4.使用递归 中序遍历一棵二叉树 5.使用递归 后序遍历一棵二叉树 ...PS2:每句代码都有详细注释

    递归动态树递归动态树

    递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树递归动态树...

    二叉树递归与非递归遍历

    二叉树递归与非递归遍历

    经典递归转化为非递归

    这个分类里面不好选,有可能选错分类了,但是如果你学编程,一定要学数据结构与算法的。递归很好用,也很难用。

    读懂C++递归程序

    递归在计算学科中是一种非常重要的方法,计算理论中到处都有用递归进行表述的问题及求解方法。 在程序设计中,数据描述和算法表达也常用递归,通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题...

    python基础教程-递归函数.pdf

    " …………………………………………. 自己调用自己 递归 – 德罗斯特效应 递归 – 定义 递归:程序调用自身 形式:在函数定义有直接或间接 调用自身 递归 - 阶乘 def p(n): x = 1 i = 1 while( i ): x = x * i i= i...

Global site tag (gtag.js) - Google Analytics