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

关于用java写的递归函数的问题~~
下面这个程序实现的功能是:求一个五位数abcde,使得abcde*4=edcba(不能使用if,for,while,swith等语句)。
        我碰到的问题是这样的:当我调用solve方法的时候,把参数值设为是10000的时候就会出现好像是栈溢出的异常,如果我设成是20000就不会出现这中错误了,不知道是什么原因,希望大家能帮忙解释一下,谢谢~~
public   class   Test   {

        public   long   solve(long   no)   {
String   str   =   String.valueOf(no);
String   newstr   =   str.substring(4)   +   str.substring(3,   4)
+   str.substring(2,   3)   +   str.substring(1,   2)
+   str.substring(0,   1);

long   e   =   Long.parseLong(newstr);
                return   (no   >   99999)   ?   1   :   ((e   ==   no   *   4)   ?   no   :   solve(++no));
}

public   static   void   main(String[]   args)   {
Test   test   =   new   Test();
System.out.println(test.solve(19999));
}
}

------解决方案--------------------
递归调用是要用堆栈的,只要条件不满足,就会一层一层地往上加,因为 19999 离正确答案 21978,比 10000 接近很多,不至于导致栈溢出,这个递归我试了一下,临界值在 18959~21978 之间,不在这个范围内的值都会导致栈溢出。

这个程序没有必要使用递归进行处理,递归的效率低于循环的效率,而且很容易导致栈溢出。