日期:2014-05-20  浏览次数:20772 次

在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的栈吗?