论坛首页 Java企业应用论坛

数据结构与算法(JAVA篇)之递归算法(一)

浏览 15151 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-11-20   最后修改:2008-11-23
/**
 *
 * @author SunnyMoon
 */


/**
 * 概念介绍:
 * 递归是一种方法(函数)调用自已编程技术。
 * 递归就是程序设计中的数学归纳法。
 * 例如:tri(n)=1            if n=1
 *     tri(n)=n+tri(n-1)    if n>1
 * 可能while循环方法执行的速度比递归方法快,但是为什么采用递归呢。
 * 采用递归,是因为它从概念上简化了问题,而不是因为它提高效率。
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Recursion {//求三角数字的递归算法:1,3,6,10,15,21, ......

    static int theNumber;

    public static void main(String[] args) throws IOException {
        System.out.print("Enter a number: ");
        theNumber = getInt();
        //使用递归时调用,默认
        int theAnswer = triangle(theNumber);
        //使用非递归时调用
        //int theAnswer=triangle2(theNumber);
        System.out.println("Result: " + theAnswer);
    }

    public static int triangle(int n) {//递归方法,循环调用
        if (n == 1) {
            return 1;
        } else {
            return (n + triangle(n - 1));
        }
    }

    public static int triangle2(int n) {//非递归方法
        int total = 0;
        while (n > 0) {
            total = total + n--;
        }
        return total;
    }

    public static String getString() throws IOException {
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
        String s = br.readLine();
        return s;
    }

    public static int getInt() throws IOException {
        String s = getString();
        return Integer.parseInt(s);
    }
}

/**
 * 运行结果:
 * Enter a number: 
 * 3
 * Result: 6
 */

/**
 * 总结:
 * 使用非递归的方式更简洁,更易懂,运行效率更高,为什么还要用递归的算法呢。
 * 递归使规模逐渐降低的方式解决问题,以这种统一的方式解决足够复杂的问题。
 */

 

 


 

 

 

 

   发表时间:2008-11-20  
感觉递归还是很好用的
尤其是多个方法相互递归 能解决些复杂问题
0 请登录后投票
   发表时间:2008-11-20  
递归用了很多年了,感觉递归简单易懂
0 请登录后投票
   发表时间:2008-11-20  
sunnymoon 写道

/**
 * 总结:
 * 使用非递归的方式更简洁,更易懂,运行效率更高,为什么还要用递归的算法呢。
 * 递归使规模逐渐降低的方式解决问题,以这种统一的方式解决足够复杂的问题。
 */

你的说法不对,大多数情况下,递归要比非递归的效率要高,仅对少数尾递归,它可以很容易的转换为非递归形式的情况下,非递归的效率才比较高。你试着将快速排序转换成非递归的形式(这可不是件容易的事),看看它们的效率的谁高?

0 请登录后投票
   发表时间:2008-11-20  
看来我来这里是正确的,这里的人气很旺,而且大家的水平都不差。
我以前用CSDN的Blog,试试看的太度发了一篇,来到这里后感觉喜欢上了这里。以后把家安到这里,在这里建家了。
另外感谢朋友们的热情回复。
0 请登录后投票
   发表时间:2008-11-20  
lifethinker 写道
sunnymoon 写道

/**
 * 总结:
 * 使用非递归的方式更简洁,更易懂,运行效率更高,为什么还要用递归的算法呢。
 * 递归使规模逐渐降低的方式解决问题,以这种统一的方式解决足够复杂的问题。
 */

你的说法不对,大多数情况下,递归要比非递归的效率要高,仅对少数尾递归,它可以很容易的转换为非递归形式的情况下,非递归的效率才比较高。你试着将快速排序转换成非递归的形式(这可不是件容易的事),看看它们的效率的谁高?


那要看保存多少现场了。

0 请登录后投票
   发表时间:2008-11-20  
lifethinker 写道

sunnymoon 写道

/** * 总结: * 使用非递归的方式更简洁,更易懂,运行效率更高,为什么还要用递归的算法呢。 * 递归使规模逐渐降低的方式解决问题,以这种统一的方式解决足够复杂的问题。 */
你的说法不对,大多数情况下,递归要比非递归的效率要高,仅对少数尾递归,它可以很容易的转换为非递归形式的情况下,非递归的效率才比较高。你试着将快速排序转换成非递归的形式(这可不是件容易的事),看看它们的效率的谁高?

Hi,

你好。看得出来你是一个高手。
我想说的仅在本例子中的情况,并且试图说明在非递归比递归的效率高的情况下为什么还会使用到递归,另外以此引出一此程序设计的思想(问题规模转化),仅此而已。
你说的很对,我们以后再继续研究更复杂的情况吧。

Best regards,
Br,
SunnyMoon
0 请登录后投票
   发表时间:2008-12-03  
我觉得递归就像一个前序遍历的过程,
我以PHP代码为例:
$ar=array(0=>array('name'=>'食物','id'=>1,'pid'=>0),
          1=>array('name'=>'植物','id'=>2,'pid'=>0),
          3=>array('name'=>'水果','id'=>3,'pid'=>1),
          4=>array('name'=>'树','id'=>4,'pid'=>2), 
          5=>array('name'=>'苹果','id'=>5,'pid'=>3),
          6=>array('name'=>'松树','id'=>6,'pid'=>4),
          7=>array('name'=>'饮料','id'=>7,'pid'=>1),
             8=>array('name'=>'红苹果','id'=>8,'pid'=>5)     
);
function tree($tree,$pid,&$res=""){
	foreach ($tree as $key=>$items){
		  if($items['pid']==$pid){
		  	         $newid=$items['id'];
                	 $res.=$newid.",";
                	 tree($tree,$newid,$res);
					 
	     	  } 
	}
	return $res;
}
echo tree($ar,0);

结果是:1,3,5,8,7,2,4,6,
我们可以给出一棵树更直观
                    0
            1          2
         3      7    4
         5           6
         8
0 请登录后投票
   发表时间:2008-12-03  
sunnymoon 写道
lifethinker 写道

sunnymoon 写道

/** * 总结: * 使用非递归的方式更简洁,更易懂,运行效率更高,为什么还要用递归的算法呢。 * 递归使规模逐渐降低的方式解决问题,以这种统一的方式解决足够复杂的问题。 */
你的说法不对,大多数情况下,递归要比非递归的效率要高,仅对少数尾递归,它可以很容易的转换为非递归形式的情况下,非递归的效率才比较高。你试着将快速排序转换成非递归的形式(这可不是件容易的事),看看它们的效率的谁高?

Hi,

你好。看得出来你是一个高手。
我想说的仅在本例子中的情况,并且试图说明在非递归比递归的效率高的情况下为什么还会使用到递归,另外以此引出一此程序设计的思想(问题规模转化),仅此而已。
你说的很对,我们以后再继续研究更复杂的情况吧。

Best regards,
Br,
SunnyMoon



看来你经常写邮件,递归非递归who效率高这个问题没有context讨论起来有意义吗
0 请登录后投票
   发表时间:2008-12-11  
博主觉得我说的有理不?之前是PHP版的,现在发一个JAVA版的
package test;
import java.util.*;
class category{
	String name;
	int id;
	int pid;
	category(String name,int id,int pid){
		this.name=name;
		this.id=id;
		this.pid=pid;
	}
}
public class digui {
  String  res="";
   public String tree(Collection co,int pid){
	     Iterator<category> it=co.iterator();
	     while(it.hasNext()){
	    	  category ct=it.next();
	    	  if(ct.pid==pid){
	    		  int id=ct.id;
	    		   res+=Integer.valueOf(id)+",";
	    		   tree(co,id);
	    	  }
	     }
	     return res;
   }
   public static void main(String[] args){
	   Collection<category> co=new ArrayList<category>();
	   co.add(new category("食物",1,0));
	   co.add(new category("植物",2,0));
	   co.add(new category("水果",3,1));
	   co.add(new category("树",4,2));
	   co.add(new category("苹果",5,3));
	   co.add(new category("松树",6,4));
	   co.add(new category("饮料",7,1)); 
	   co.add(new category("红苹果",8,5));
	   digui dg=new digui();
	   String ress=dg.tree(co, 0);
	   System.out.println(ress);
	  
	   
   }
	
}

0 请登录后投票
论坛首页 Java企业应用版

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