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("------------------------------------------------------------");
} }
修改“totalTimes”,当到达一定值时,报如下错误:

public static void cycle(int totalTimes, int time)
{
if(totalTimes > 1)
{
System.out.println("这是第 " + time + "次调用!");
}
else
{
System.out.println("调用结束,共调用了" + time + "次");
}
}
代替recuresion()方法:
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;
}
}
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("--------------------
整个代码如下:
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 cycle(int totalTimes, int time)
{
if(totalTimes > 1)
{
System.out.println("这是第 " + time + "次调用!");
}
else
{
System.out.println("调用结束,共调用了" + time + "次");
}
} public static void main(String[] args)
{
int totalTimes = 100000;
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("------------------------------------------------------------"); 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("------------------------------------------------------------");
} }






栈溢出了,JVM依然是采用栈式的虚拟机,这个和C和Pascal都是一样的。函数的调用过程都体现在堆栈和退栈上了。你调用构造函数的“层”太多了,以致于把栈区溢出了。
通常来讲,一般栈区远远小于堆区的,因为函数调用过程往往不会多于上千层,而即便每个函数调用需要1K的空间(这个大约相当于在一个C函数内声明了256个int类型的变量),那么栈区也不过是需要1MB的空间。通常栈的大小是1-2MB的。通常递归也不要递归的层次过多,很容易溢出.
对java.lang.StackOverflowError的分析:
原因:运行一个程序,JVM会开辟一块内存空间去储存程序进行时的某些信息,当程序运行时需要储存的信息超过了分配的空间,就会出现那样的问题.比如死循环,
解决:首先从程序代码优化方面着手,检查是否有死循环、递归等程序,如果有,修正、优化相关代码。
Java递归调用改成非递归的更多相关文章
- 深度优先搜索(DFS)递归形式改为非递归形式
DFS将递归改为非递归这个方法的需求来自于一道三维积木组合的题目,还在苦苦调试中,暂且不提. 普通的认识对于递归向非递归的转化无非是使用栈,但是结合到深度搜索如何将栈很好利用,如何很好保存现场,都不是 ...
- C# Windows Phone 8 WP8 开发,将WebClient的DownloadStringCompleted事件改成非同步的awiat方法。
原文:C# Windows Phone 8 WP8 开发,将WebClient的DownloadStringCompleted事件改成非同步的awiat方法. 一般我们在撰写Windows Phone ...
- Java 递归、尾递归、非递归、栈 处理 三角数问题
import java.io.BufferedReader; import java.io.InputStreamReader; //1,3,6,10,15...n 三角数 /* * # 1 * ## ...
- Java 递归、尾递归、非递归 处理阶乘问题
n!=n*(n-1)! import java.io.BufferedReader; import java.io.InputStreamReader; /** * n的阶乘,即n! (n*(n-1) ...
- java创建二叉树并实现非递归中序遍历二叉树
java创建二叉树并递归遍历二叉树前面已有讲解:http://www.cnblogs.com/lixiaolun/p/4658659.html. 在此基础上添加了非递归中序遍历二叉树: 二叉树类的代码 ...
- java只http改成https访问
目录 生成keystore文件 修改tomcat中的server.xml文件 配置浏览器 生成keystore文件: 1.在tomcat的bin 目录下输入命令:keytool -genkeypair ...
- 如何由jdk的安装版本改成非安装版本
背景. 官网一般只提供windows下的exe文件,不提供zip打包文件.有些不愿意使用安装版本. 解决方法 本文以windows 7下安装jdk-6u35-windows-x64.exe为例说明 1 ...
- JAVA 遍历文件夹下的所有文件(递归调用和非递归调用)
JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = ...
- [复习] JAVA 遍历目录 (递归调用和非递归)
JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = ...
随机推荐
- BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS
BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS Description Farmer John has taken the cows to a va ...
- SpringMVC将url生成二维码图片直接展示在页面上
利用google的开源包zxing生成二维码 第一步:maven项目的zxing依赖 <!-- google zxing 生成二维码 --> <dependency> < ...
- bzoj4516
后缀自动机 留个板子 upd:大概懂了 每次新加入的npRight集合肯定只有最后一个位置,那么求所有长得不一样的子串贡献就是Max-Min+1,因为Right集合只有这一个位置,所以这Max-Min ...
- 网络爬虫之requests模块的使用+Github自动登入认证
本篇博客将带领大家梳理爬虫中的requests模块,并结合Github的自动登入验证具体讲解requests模块的参数. 一.引入: 我们先来看如下的例子,初步体验下requests模块的使用: ...
- linux中vim常用命令总结
- PTA 计算平均值
现在为若干组整数分别计算平均值. 已知这些整数的绝对值都小于100,每组整数的数量不少于1个,不大于20个. 输入格式:首先输入K(不小于2,不大于20).接下来每一行输入一组数据(至少有一组数据), ...
- hdoj1097
好久没有遇到过这样的题,似乎记得以前完全就是靠规律啊什么的.... 然后刚刚看到,这不就是快速幂取膜就好了嘛- #include <stdio.h> #include <string ...
- 分析spring aop的源码实现
AOP就是面向切面编程,我们可以从几个层面来实现AOP. 在编译器修改源代码,在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码,以下是各种实现机制的比较. spring AOP是Sp ...
- Codeforces Round #510 (Div. 2) A&B By cellur925
第一次CF祭== 由于太菜了只做了前两题== 因为在第一题上耗费时间太多了,我还是太菜了==. A. Benches time limit per test 1 second memory limit ...
- Spring + MyBaits java.lang.reflect.InvocationTargetException 启动日志报错
调试发现 实例化 class org.apache.ibatis.logging.slf4j.Slf4jImpl时发生异常,所以 slf4j jar 问题解决: http://www.cnblogs. ...