极昼暗语leo
2017-11-24 04:20
采纳率: 100%
浏览 4.0k
已采纳

java里递归次数太多,为什么会出错?

萌新自己写了一个用链表找质数的代码,运行时没问题,但如果输入的数太大,就会出错,为什么会这样?求大神解答,万分感谢!
代码如下:

//一个找出质数的程序

public class Zhishu{
public static Zhishu firstZhishu=new Zhishu(2);
public Zhishu next=null;
public int number=0;

  private Zhishu(int number){
     this.number=number;
  }

  public static void main(String[] args){
     Zhishu.find(19);
     Zhishu.find(17);
     Zhishu.find(100);
     Zhishu.find(1000);
     Zhishu.find(1069);
     Zhishu.find(3630);
     Zhishu.find(5000);
  }

  public static void find(int n){
     find(n,firstZhishu);
  }

  private static void find(int n,Zhishu a){
        if (n==a.number){
           System.out.println(n+"是质数");
           return;
        }else if(n<a.number){
           System.out.println(n+"不是质数");
           return;
        }else if(a.next==null){
           find(a.number+1,n,a);
        }else{
           find (n,a.next);
        }
  }



  private static void find(int i,int n,Zhishu a){
     if (i<n){
        if (test(i,firstZhishu)){
           a.next=new Zhishu(i);
           find(i+1,n,a.next);
        }else{
           find(i+1,n,a);
        }
     }else{
        if (test(n,firstZhishu)){
           a.next=new Zhishu(n);
           System.out.println(n+"是质数");
        }else{
           System.out.println(n+"不是质数");
        }
     }
  }

  private static boolean test(int i,Zhishu a){
        if (i%a.number==0){
           return false;
        }else if(a.number*2>i){
           System.out.println("找到质数"+i);
           return true;
        }else{
           return (test(i,a.next));
        }
  }

}

运行结果如下:图片说明

图片说明

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

8条回答 默认 最新

  • wb_snail 2017-11-24 04:52
    已采纳

    如果报的是栈溢出就没什么好奇怪的哈,递归次数过多,虚拟机一直执行压栈操作,很快栈内存就不足了,你可以把线程的栈内存空间分配大点

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • Q544471255 2017-11-24 04:59

    出错的截图是什么?

    贴图看看

    评论
    解决 无用
    打赏 举报
  • ljheee 2017-11-24 05:37

    递归次数过多,虚拟机一直执行压栈

    评论
    解决 无用
    打赏 举报
  • 小牛宝 2017-11-24 07:12

    你的递归上SystemClock.sleep(100);延迟个一百毫秒,那么不管你递归多少次,都不会有错。

    评论
    解决 无用
    打赏 举报
  • 小牛宝 2017-11-24 07:38

    哦是我的错,你应该写java的try{
    Thread.sleep(100);
    }catch(Exception e){
    }

    评论
    解决 无用
    打赏 举报
  • 小牛宝 2017-11-24 08:41

    你知道sleep是啥意思么,一秒钟分为1000毫秒,1000毫秒又分为1000微秒 10 就是百分之一秒。延迟那么少有个毛线用,听哥的,延迟加到500,保证你无限循环都不会有错

    评论
    解决 无用
    打赏 举报
  • 小牛宝 2017-11-24 08:45

    不然不管你分配多大内存,迟早有天都会出错,话说你也没办法分配内存。楼上你采纳的答案肯定没用,你知道怎么分配更大的内存么,哥哥我做了五年java,都不知道我要怎么给我的软件分配更大的内存。所以最低延迟100毫秒,因为jvm虚拟机回收内存的时间一般是50-80毫秒,你得错开这段时间

    评论
    解决 无用
    打赏 举报
  • 小牛宝 2017-11-28 08:11

    我也试了一下,死递归不被java允许,java会在你递归过多次后抛出错误,所以如果你想尝试死循环,你得while(true) 或者for(;;);也就是说你的程序绝对无可能一直运行下去

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题