慎用Java递归调用 (一)

2014-11-24 11:49:52 · 作者: · 浏览: 39

下面先看造成java.lang.StackOverflowError即栈溢出问题:
[java]
public class RecursionTest
{

public static void recursion(int totalTimes,int time)
{
if(totalTimes > 1)
{
System.out.println("这是第 " + time + "次调用!");
totalTimes--;
time++;
recursion(totalTimes, time);
}
else
{
System.out.println("调用结束,共调用了" + time + "次");
return;
}
}

public static void main(String[] args)
{
int totalTimes = 1000000;
int time = 1;
long startTime = System.currentTimeMillis();
System.out.println("嵌套调用起始时间:" + startTime);
recursion(totalTimes, time);
System.out.println("嵌套调用结束时间:" + System.currentTimeMillis());
System.out.println("总耗时:" + (System.currentTimeMillis() - startTime));
System.out.println("------------------------------------------------------------");
}

}

public class RecursionTest
{

public static void recursion(int totalTimes,int time)
{
if(totalTimes > 1)
{
System.out.println("这是第 " + time + "次调用!");
totalTimes--;
time++;
recursion(totalTimes, time);
}
else
{
System.out.println("调用结束,共调用了" + time + "次");
return;
}
}

public static void main(String[] args)
{
int totalTimes = 1000000;
int time = 1;
long startTime = System.currentTimeMillis();
System.out.println("嵌套调用起始时间:" + startTime);
recursion(totalTimes, time);
System.out.println("嵌套调用结束时间:" + System.currentTimeMillis());
System.out.println("总耗时:" + (System.currentTimeMillis() - startTime));
System.out.println("------------------------------------------------------------");
}

}修改“totalTimes”,当到达一定值时,报如下错误:

\
在开发时,要注意避免该问题,特别是递归过多调用时,最好改为for或者whlie来代替。
如下cycle()方法:
[java]
public static void cycle(int totalTimes, int time)
{
if(totalTimes > 1)
{
System.out.println("这是第 " + time + "次调用!");
}
else
{
System.out.println("调用结束,共调用了" + time + "次");
}
}

public static void cycle(int totalTimes, int time)
{
if(totalTimes > 1)
{
System.out.println("这是第 " + time + "次调用!");
}
else
{
System.out.println("调用结束,共调用了" + time + "次");
}
}代替recuresion()方法:
[java]
public static void recursion(int totalTimes,int time)
{
if(totalTimes > 1)
{
System.out.println("这是第 " + time + "次调用!");
totalTimes--;
time++;
recursion(totalTimes, time);
}
else
{
System.out.println("调用结束,共调用了" + time + "次");
return;
}
}

public static void recursion(int totalTimes,int time)
{
if(totalTimes > 1)
{
System.out.println("这是第 " + time + "次调用!");
totalTimes--;
time++;
recursion(totalTimes, time);
}
else
{
System.out.println("调用结束,共调用了" + time + "次");
return;
}
}

[java]

再看一下对程序执行效率的影响:
仍然使用上面的例子,分别cycle()方法和在main()方法中加入如下代码:
[java]
startTime = System.currentTimeMillis();
System.out.println("循环调用起始时间:" + startTime);
for (int index = totalTimes; index > 0; index--)
{
cycle(index, time);
time++;
}
System.out.println("循环调用结束时间:" + System.currentTimeMillis());
System.out.println("总耗时:" + (System.currentTimeMillis() - startTime));
System.out.println("------