A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冷月霜飞 中级黑马   /  2015-5-21 18:55  /  11705 人查看  /  26 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

递归和for循环都可以遍历元素,这两个技术都什么时候用啊?各自的优势都是什么?

26 个回复

倒序浏览
当循环内部用到了循环,用递归;递归要提高程序的出口,不然会是死循环。

点评

加油  发表于 2015-5-28 17:42
回复 使用道具 举报
递归就是方法调用方法,这种方式遍历元素速度是很快的,但也会非常的吃内存,所以一旦数据很大是不建议用递归的。
回复 使用道具 举报
JavaStudy770 发表于 2015-5-22 23:30
递归就是方法调用方法,这种方式遍历元素速度是很快的,但也会非常的吃内存,所以一旦数据很大是不建议用递 ...

递归调用方法速度比for循环快?   我了解好像不是这样,
递归是不确定循环次数的时候用,而for循环是知道循环多少次,不是有控制循环变量?
递归就是自己调用自己,没掉用一次方法压栈一次,相当于在内存开辟了一个空间,每次调用都开辟一个空间,
会造成内存空间溢出,每个计算机的内存不一样,这个值是不一样的.
但是for循环就不同
回复 使用道具 举报
递归是对自己(方法)而言的,for循环是对次数有限的情况下对某个方法而言
回复 使用道具 举报
递归使用的时候要注意出口,不return出口会造成死循环.
回复 使用道具 举报
zxj35986847 发表于 2015-5-22 23:47
递归调用方法速度比for循环快?   我了解好像不是这样,
递归是不确定循环次数的时候用,而for循环是知道循 ...

就是啊,每调用就在桟内存中开辟一个空间,这不很耗桟内存么?说他快是在特定条件下,数据不是很大的情况下(递归过程中不要超过了桟内存),因为它是在桟内存中开辟空间,而桟内存里的变量是执行速度是最快的,所以说递归速度快啊
回复 使用道具 举报
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
递归耗内存,不停地调用堆栈,效率低,计算数据有限,如果堆栈溢出,递归就结束了,循环没事 ...

正解..



你说的符合我的观点.
回复 使用道具 举报
楼上的都很厉害
回复 使用道具 举报
递归一般用在算法分析回溯法中,用小问题解决大问题。。。先从上层遍历到底部。。。
for循环,一般用在遍历数组,变数二叉树等!
回复 使用道具 举报
递归是方法自身的调用,而且要给它提供出口。一般来说不建议使用递归,它的时间复杂度高,效率慢,对于大点的数据还要消耗不少内存。
回复 使用道具 举报
递归耗内存,不停地调用堆栈,效率低,计算数据有限,如果堆栈溢出,递归就结束了,循环没事
回复 使用道具 举报
学习了!!
回复 使用道具 举报
递归是方法调用本身,总是要进出堆栈内存,容易导致内存溢出,并且运行慢,循环是直接在内存中执行,速度快
回复 使用道具 举报
来瞅瞅。。。。。。。。
回复 使用道具 举报
CLAY 中级黑马 2015-5-27 17:15:30
18#
来瞅瞅,又涨知识了
回复 使用道具 举报
学习了                                         
回复 使用道具 举报
飘过看看
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马