论坛首页 Java企业应用论坛

递归有好有坏的……

浏览 2926 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (3)
作者 正文
   发表时间:2009-03-22   最后修改:2009-03-22
   迭代和递归,各有各的好,在我看来,递归好了程序员,害了电脑,而迭代相反,他要求程序员为程序考虑的很多,运行起来就会好很多。
举个例子 斐波那契数吧
以下是分别用两者实现的。请比较
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-23  
个人感觉 递归更接近于数学思维……迭代更接近于计算机思维
0 请登录后投票
   发表时间:2009-03-23  
"迭代和递归,各有各的好,在我看来,递归好了程序员,害了电脑,而迭代相反,他要求程序员为程序考虑的很多,运行起来就会好很多。 "
也未必。就看程序怎么写了
0 请登录后投票
   发表时间:2009-03-23  
递归有一个很大的优势:递归的过程往往是自描述的,而迭代则往往需要外部的指令,比如迭代次数.递归是自己检测到停止,而迭代"我告诉你什么时候停,你就什么时候停",所以在一些自适应的系统里,无法得到外部的指令(迭代次数),则只能用递归.还有很多函数式语言(比如Erlang),这些语言是不允许改变变量值的,所以无法通过指令式的方式进行,只能用递归.
0 请登录后投票
   发表时间:2009-03-23  
递归是很方便程序员思考的,思路非常的清晰,但是资源浪费很严重
而迭代是相当高效的计算方法。
我推崇的方式就是用递归来思考问题,然后寻找是否有可能由递归方法转换成用迭代的方法来解决。
1 请登录后投票
   发表时间:2009-03-23  
lz例子跟要说明的意图容易产生误解
0 请登录后投票
   发表时间:2009-03-23  
Element&lina 写道
lz例子跟要说明的意图容易产生误解


何以见得,请不吝赐教
0 请登录后投票
   发表时间:2009-03-25  
汉诺塔用迭代要怎么写?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics