黑马程序员技术交流社区

标题: 递归和for循环有什么区别啊? [打印本页]

作者: 冷月霜飞    时间: 2015-5-21 18:55
标题: 递归和for循环有什么区别啊?
递归和for循环都可以遍历元素,这两个技术都什么时候用啊?各自的优势都是什么?
作者: 914360849    时间: 2015-5-22 22:48
当循环内部用到了循环,用递归;递归要提高程序的出口,不然会是死循环。
作者: JavaStudy770    时间: 2015-5-22 23:30
递归就是方法调用方法,这种方式遍历元素速度是很快的,但也会非常的吃内存,所以一旦数据很大是不建议用递归的。
作者: zxj35986847    时间: 2015-5-22 23:47
JavaStudy770 发表于 2015-5-22 23:30
递归就是方法调用方法,这种方式遍历元素速度是很快的,但也会非常的吃内存,所以一旦数据很大是不建议用递 ...

递归调用方法速度比for循环快?   我了解好像不是这样,
递归是不确定循环次数的时候用,而for循环是知道循环多少次,不是有控制循环变量?
递归就是自己调用自己,没掉用一次方法压栈一次,相当于在内存开辟了一个空间,每次调用都开辟一个空间,
会造成内存空间溢出,每个计算机的内存不一样,这个值是不一样的.
但是for循环就不同

作者: 18463730277    时间: 2015-5-22 23:52
递归是对自己(方法)而言的,for循环是对次数有限的情况下对某个方法而言
作者: zxj35986847    时间: 2015-5-22 23:52
递归使用的时候要注意出口,不return出口会造成死循环.
作者: JavaStudy770    时间: 2015-5-23 00:23
zxj35986847 发表于 2015-5-22 23:47
递归调用方法速度比for循环快?   我了解好像不是这样,
递归是不确定循环次数的时候用,而for循环是知道循 ...

就是啊,每调用就在桟内存中开辟一个空间,这不很耗桟内存么?说他快是在特定条件下,数据不是很大的情况下(递归过程中不要超过了桟内存),因为它是在桟内存中开辟空间,而桟内存里的变量是执行速度是最快的,所以说递归速度快啊
作者: JavaStudy770    时间: 2015-5-23 00:27
JavaStudy770 发表于 2015-5-23 00:23
就是啊,每调用就在桟内存中开辟一个空间,这不很耗桟内存么?说他快是在特定条件下,数据不是很大的情况 ...

据我了解开发中是很少用到递归的,如下代码同样是给int[]数组赋值,用递归是很容易超出桟内存空间的:

  1. public class Test2 {

  2.         public static void main(String[] args) {
  3.                
  4.                 int[] arr = new int[1024*3];
  5.                 //forF(arr);
  6.                 Long start = System.currentTimeMillis();
  7.                 recursion(arr,0);
  8.                 Long end = System.currentTimeMillis();
  9.                 System.out.println(end-start);
  10.                 for(int i=0; i<arr.length; i++) {
  11.                         System.out.println(arr[i]);
  12.                 }
  13.         }
  14.         public static void forF(int[] arr) {
  15.                 Long start = System.currentTimeMillis();
  16.                 for(int i=0; i<arr.length; i++) {
  17.                         arr[i] = i;
  18.                 }
  19.                 Long end = System.currentTimeMillis();
  20.                 System.out.println(end-start);
  21.         }
  22.         public static void recursion(int[] arr, int index) {
  23.                
  24.                 if(index == arr.length-1) {
  25.                         arr[index] = index;
  26.                         return ;
  27.                 } else {
  28.                         arr[index] = index;
  29.                         index ++;
  30.                         recursion(arr, index);
  31.                 }
  32.         }
  33. }
复制代码

作者: kingowe    时间: 2015-5-23 08:48
递归耗内存,不停地调用堆栈,效率低,计算数据有限,如果堆栈溢出,递归就结束了,循环没事
作者: zxj35986847    时间: 2015-5-25 23:09
kingowe 发表于 2015-5-23 08:48
递归耗内存,不停地调用堆栈,效率低,计算数据有限,如果堆栈溢出,递归就结束了,循环没事 ...

正解..



你说的符合我的观点.
作者: rsl123456    时间: 2015-5-26 11:27
楼上的都很厉害
作者: 小车车    时间: 2015-5-26 13:16
递归一般用在算法分析回溯法中,用小问题解决大问题。。。先从上层遍历到底部。。。
for循环,一般用在遍历数组,变数二叉树等!
作者: 哈哈哈哈    时间: 2015-5-26 13:46
递归是方法自身的调用,而且要给它提供出口。一般来说不建议使用递归,它的时间复杂度高,效率慢,对于大点的数据还要消耗不少内存。
作者: 凉仁日记    时间: 2015-5-26 16:38
递归耗内存,不停地调用堆栈,效率低,计算数据有限,如果堆栈溢出,递归就结束了,循环没事
作者: l598790586    时间: 2015-5-26 17:04
学习了!!
作者: zhousuo28    时间: 2015-5-27 16:01
递归是方法调用本身,总是要进出堆栈内存,容易导致内存溢出,并且运行慢,循环是直接在内存中执行,速度快
作者: 王建伟    时间: 2015-5-27 16:54
来瞅瞅。。。。。。。。
作者: CLAY    时间: 2015-5-27 17:15
来瞅瞅,又涨知识了
作者: 叶燕希    时间: 2015-5-27 20:23
学习了                                         
作者: 途中ms前进    时间: 2015-5-28 11:07
飘过看看
作者: 进击的蜗牛    时间: 2015-5-28 11:50
学习学习
作者: 夏尔    时间: 2015-5-28 13:04
我是来看评论的  嘿嘿
作者: 汪汪    时间: 2015-5-28 13:17
学习了.
作者: ETOLIA    时间: 2015-5-28 16:20
看过这样一句话,跟你分享一下。

凡是用递归能做到的,用循环或者其他方式同样也能做到。
但是有时候用递归,短短几行代码就可以解决问题,用循环却要写半天。

优势。你的思路好,知道你自己在干什么,那你可以用递归,很可能方便开发。
但是不容易想。

循环容易想,但是有时候需要多打好多行代码。

至于楼上说的效率,个人感觉要视具体情况而定,不能直接就说谁高谁低。
作者: 石头888    时间: 2015-5-28 16:47
学习学习!
作者: 冷月霜飞    时间: 2015-6-1 14:47
各位师兄讨论的很是热烈,学习了!




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