黑马程序员技术交流社区

标题: 关于递归太深引发栈溢出异常问题!!!求解! [打印本页]

作者: 聂益飞    时间: 2013-3-28 21:27
标题: 关于递归太深引发栈溢出异常问题!!!求解!
  1. class Ticket
  2. {       
  3.         static int ticket = 100;
  4.         Ticket t = new Ticket();
  5.         static void sale()
  6.         {
  7.                 System.out.println("ticket num is :" + ticket--);
  8.         }
  9.         public static void main(String[] args)
  10.         {
  11.                 //当用对象调用sale()时,出现StackOverflowError,栈溢出错误
  12.                 new Ticket().sale();
  13.                 //而当直接使用静态的方式,直接调用sale()时,就不报错,?
  14.                 //sale();
  15.         }
  16. }
复制代码

作者: 刘胜寒    时间: 2013-3-28 21:36
加个判断结束的...你的没有控制结束语句,if(ticket<=0) return ;就不会一直递归下去了
作者: 夏振博    时间: 2013-3-28 21:48
本帖最后由 夏振博 于 2013-3-28 22:08 编辑

递归最不可缺的是递归的出口 ,就是在什么情况下让它停止递归
正好昨天晚上帮朋友讲递归时写的代码 5*4*3*2*1=?你可以研究下
你这代码我真心没搞明白,Ticket t = new Ticket();干嘛用的,想递归?你代码溢出就是因为这段代码,不断的调用自己到这里就调用,下面的代码一直都没执行
  1. public class Demo {
  2.         public static void main(String[] args) {
  3.                 System.out.println(Demo.diGui(5));
  4.         }
  5.         private static int diGui(int i){
  6.                 if(i==1)return 1;//这就是出口
  7.                 else return i*diGui(i-1);
  8.         }
  9. }
复制代码

作者: 张豪杰    时间: 2013-3-28 22:00
我差点都被你绕过去了
你自己仔细观察下你的代码
第四行, Ticket t = new Ticket();
你在类的内部创建了一个本类对象
所以你在main函数中,new一个对象的时候,jvm会开始加载类进内存,遇到Ticket t = new Ticket();这个语句,又创建一个新的对象。。。。递归的是这个部分
跟你有没有调用sale()方法无关!
作者: VOIDMAIN    时间: 2013-3-29 22:58
递归一定要有出口,一个重要原则就是递归要向已知方向递归;
作者: 陈原野    时间: 2013-3-29 23:13
递归也就是函数自身调用自身的编程手法或者表现形式       
递归注意事项:
        1.限定条件
        2.要注意递归的次数,尽量避免内存溢出.




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