黑马程序员技术交流社区

标题: 递归与循环 [打印本页]

作者: 郝少普    时间: 2012-11-19 23:47
标题: 递归与循环
本帖最后由 sp000 于 2012-11-20 21:57 编辑

递归和循环 分别有什么长处,短处?
什么情况用递归比较好? 什么情况用循环比较好?
作者: madianguo    时间: 2012-11-20 00:25
递归
列出指定目录下所有文件和文件夹包括子目录
         public static void main(String[] args){
                   File dir = new File("d:\\java");   //创建File对象
                   showDir(dir);
         }
         
         public static void showDir(File dir){
                   System.out.println(dir);     //输出文件夹
                   File[] files = dir.listFiles();    //创建数组
                   for(int x=0; x<files.length; x++){
                            if(files[x].isDirectory())   //如果文件是目录
                                     showDir(files[x]);   //循环调用
                            else
                                     System.out.println(files[x]);
                   }
         }
递归,你可以想想成循环。for循环也可以看作类似递归的东西。
但是循环和递归有个本质区别在于,for循环,是在循环外,进行判断,以决定是否直接退出。而递归,是在循环体内判断,是否退出本次循环。这里就有两个差别了。
你可以把递归看做到楼顶取东西。从一楼爬,看,不是的,继续爬,每层楼梯看上去都一样,你执行的过程都一样,但是实际上,1到2,2到3的楼梯是两个楼梯,等你到楼顶了,取了东西,你不能直接就跳楼,还得从楼顶一层层退回来。
而驴子拉磨,则属于for循环。无论跑多少次,都是在原地。变化的只是磨盘里磨的东西,而不是驴每圈所在的不同位置。

循环可以实现大部分的功能,但有些功能需要大量的循环调用,且自身调用自身。可以采用递归,有利于程序的可读性。

循环更加高效些,当一次循环结束就会释放内存。而递归则会调用一次在内存中占用一次空间,只有当调用完最后一次才会释放内存。

作者: 徐军涛    时间: 2012-11-20 00:42
递归:一个过程或函数在其定义或说明中直接或间接调用自身的一种方法,
        优点:
        它通常把一个大型复杂问题层转化为一个与原问题相似的规模较小的问题来求解,
        递归策略只需要少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
        递归的能力在于用有限的语句来定义对象的无限集合
        缺点:
                递归算法解题相对常用的算法如普通循环等,运行效率较低
                递归的底数过多容易造成栈溢出等

循环:一致重复的做某件事情,直到条件不满足。
        优点:循环比递归效率高
        缺点:多层次嵌套循环会导致程序冗长
作者: 陈军    时间: 2012-11-20 12:36
首先你要理解递归。
递归的缺点;   就拿遍历目录来说,如果你遍历的目录次数。递归可能会出现内存溢出。
   因为你在调用递归时,前面个方法还没结束。你就进行下一个递归操作了。如此反复。
   多到一定程序后肯定会占一定大的空间。
递归优点: 适合人类的思想方式,很容易理解。所以很多算法也是基于递归实现。

循环。你要理解。
循环一次。循环体类的一些局部变量就会释放一次,所以如果控制了循环就不会占太大空间(内存)。
当然如果是死循环。肯定挂。








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2