在N阶乘中发现的JAVA递归问题
心血来潮,写了个N阶乘小程序,在大于10000的时候,抛出了
java.lang.StackOverflowError错误.估计是递归嵌套太多所造成的.后来上网搜索了一下,发现果然是这个原因.
为了简化这个问题描述,另外写了段非常简单测试.
public class T {
int max;
T(int i){
max = i;
}
void Recursive(int i){
if(i > 0)
Recursive(--i);
else
return;
}
public static void main(String[] args){
T t= new T(100000);//10000没有问题,加上个0就有问题了
t.Recursive(t.max);
}
}
我想请问各位,有没有办法能够加深STACK的长度.
(java -Xss128m T 我已经试过了,似乎没有作用,bea的解释是java栈有两种,java 和c的.这个参数只能对c的栈起作用).
我想,之所以用递归,就是因为大家不知道程序执行的深度是多少.那怎么样解决递归所带来的这个运行错误呢?
如果实在有必要转换成非递归方法,请各位高手为小弟指条N阶乘的算法思想吧.
------解决方案--------------------如果递归深度是不确定并且无最大值,而且你又非用递归不可,又不让 JVM 崩掉,那是不可能的。
就算JVM没有限制,OS 也有限制。
就算OS 没有限制,RAM也有极限。
就算你用的虚拟内存,那硬盘空间也有限制。
所以,像你这种问题是不可能解决的。
------解决方案--------------------解决不了
确实有你说的问题
csdn上 不是星星的回答基本上不用看
XX太多了
------解决方案--------------------兄弟 递归不是用来玩的。
强烈反对用递归来做阶乘问题和神奇数字(斐波那契数列)问题的。有循环放着不用,用这个简直是在糟蹋程序,并且糟蹋硬件。
不管在任何地方,任何语言,递归都是尽量避免使用的。虽然没有goto那么明确,但是肯定是说过,尽量避免使用。更没有你这么用的。
不过这样也告诉我们一个教训:使用递归的时候,一定要记得检测内存,及时抛出异常,否则程序中止丢失数据了,可是影响了程序的健壮性的。
------解决方案--------------------汗,大家别争论了,楼主是用在说JVM的栈的容量问题。
不是N的阶乘。
不是递归。
大家有什么好的办法扩展JVM的栈吗?