用递归算法写一段程序实现 1+2+...+1000000 、java.lang.StackOverflowError 异常,原因,bug调查,处理

43 篇文章 6 订阅
Exception in thread "main" java.lang.StackOverflowError

题目原来是:用递归算法写一段程序实现 1+2+...+1000000
然后,简单吗,就是个递归吗,有基础的同学,分分钟就把代码给码完了。
但是,面试的时候,自己没电脑的吗,你又不知道代码的运行结果是啥。
写完之后,感觉甚好。

但是,在机器上一运行就炸了。具体如下:

package com.lxk.test;

public class Questions {
    /**
     * 用递归算法写一段程序实现 1+2+...+1000000
     */
    private static long questions7(long sum) {
        if (sum == 0) {
            return sum;
        }
        return sum + questions7(sum - 1);
    }

    public static void main(String[] args) {
        long result = questions7(10000);
        System.out.println(result);
    }
}


运行结果:



原因:
这个问题一般是你的程序里头可能是有死循环或递归调用所产生的
上面是一百万以内的数计算和,这个一直调用自己,方法栈一直分配空间,直到溢出,报异常。炸了。


一千还是OK的,但是一万就炸了,别提一百万了。


总结,为了避免这个异常,实际代码最好绕过使用递归算法。因为你不确定将来的需求会不会真的有100变成100万,我是针对上面的例子来说的。

你用其他方法算不行吗?


这个题的主要方向可能如下:

1,看你会不会写个递归

2,看你知道不知道递归会出现这个堆栈溢出,当然,我觉得出题人,估计也不知道这个题目会溢出。

3,如果出题人知道这个会溢出的话,那么考的就比较高深了,那就是建议,代码里面要避免,不推荐,使用递归来处理问题。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值