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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 回首、后_街 中级黑马   /  2013-4-18 22:29  /  1062 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 回首、后_街 于 2013-4-19 20:14 编辑

//使用递归实现运算
private static int File1List_3(int num) {
  // TODO Auto-generated method stub
  
   if(num==1)
    return 1;
   return num+File1List_3(num-1);
}

当输入100或1000的时候可以正常运行输出,为什么输入很大的值的时候会报异常???比如输入80000就会爆出异常 不是很理解这问题。。。
出现堆栈溢出
Exception in thread "main" java.lang.StackOverflowError
at Test.File1List_3(Test.java:21)
at Test.File1List_3(Test.java:21)
at Test.File1List_3(Test.java:21)
at Test.File1List_3(Test.java:21)
at Test.File1List_3(Test.java:21)
at Test.File1List_3(Test.java:21)
at Test.File1List_3(Test.java:21)
at Test.File1List_3(Test.java:21)
at Test.File1List_3(Test.java:21)
at Test.File1List_3(Test.java:21)

评分

参与人数 2技术分 +1 黑马币 +2 收起 理由
黄玉昆 + 1
$love + 2 赞一个!

查看全部评分

3 个回复

倒序浏览
递归最容易导致的问题就是堆栈溢出了,一般来说操作系统给一个进程划分的栈内存是2M(好像是),按照正常的程序处理,局部变量进栈出栈,栈不太可能会溢出,但是递归会导致不会出栈,这就有可能导致堆栈溢出,你这里定义一个int型变量,即4字节,再加上保存的函数地址等信息,8000次递归,还有一些其他的入栈的局部变量,可能已经超出了最大的栈空间,所以溢出。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
这个循环会一直递归,直到Num的值为1才会退出循环,当你传入的值太大,循环的次数就会增加。最后就会超出int能存储的最大值2147483647,所以才会有内存溢出的问题

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 黄玉昆 于 2013-4-19 07:24 编辑

其实你可从打印出来的语句就可以看出,运行的那些语句其实就是在调用函数,每次调用都会在内存中产生空间,占用一定的内存
由于cpu的速度很快,所以小数值就会直接获得结果,你根本看不到执行的效果;当然占用的空间也是相对较小的
但是对于大数值,由于占用的空间过多,内存消耗很大,计算机运行也会慢下了的,所以你可以看到效果。严重就导致了内存溢出的情况。
所以建议在递归中不要使用大数值
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马