如何处理java中的递归Stack Overflows
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何处理java中的递归Stack Overflows相关的知识,希望对你有一定的参考价值。
虽然执行递归计算字符串排列或组合需要在每个递归级别创建新对象,但更快会导致堆栈溢出,以防止我尝试模拟字符数组或字符串生成器上的方案但问题出现时因此,在递归复杂度的每个级别上,管理字符数组或字符串构建器也变得过于复杂。
如何在这里解决这种情况是我写的代码: -
private static int solve(int num) {
if (num == 1) {
return 6;
}
combination("", "");
return list.size();
}
private static int combination(String ch, String prev) {
if (!ch.isEmpty() && ch.split(" ").length == arrInput.length)
list.add(performSum(ch));
else {
for (int i = 0; i < creditScore.length; i++) {
prev = ch;
if (ch.isEmpty())
ch = "" + creditScore[i];
else
ch = ch + " " + creditScore[i];
combination(ch, prev);
ch = prev;
}
}
return list.size();
}
这种情况可能就像假设有学生总分的组合,其中: -
credits allocated ranges from 1<= N <=5
Number of subjects from 1<= N <=100
Grade points from 5<=N<=10
Therefore as an example, a combination of score could be (1*6)+(2*10)+(4*7)....N subjects
找到完全不同的分数组合。
答案
- 确保您的递归不是无限的。否则......没有必要尝试解决。
f(x)= f(x-1)将是无限的
- 重新设计问题,尽量使其不爆炸,或尽快爆炸。尝试找到避免进一步处理的简化等。
- 记忆,存储先前运行的结果,因此您可以拥有
deeper
起点。 对于f(x)= f(x-1),您可以存储r [i],其中i = f(i * k),换句话说,您每k步存储一次结果。如果x很大,你可能想要几何存储:k ^ i。 检查树上最低的共同祖先问题,以获取存储每个k ^ i步的示例。 - 递归可以转换为循环,检查DP,动态编程。然而,增长的是状态数组,所以你仍然无法进行无限递归。
- 如果递归需求不是几何增长的并且可以建立在例如。 a)f(x)= f(x-1),x> 0; f(0)= 1或b)f(x)= f(x-1)+ f(x-2)+ f(x-3),x> 0; f(x)= 1,x <= 0 您可以从f(0)开始构建x,然后在k步骤之后将临时进度存储到挂起工作堆栈并退出递归,而不是求解f(x),然后从保存点重新开始计算。在第一个示例中,您只需要存储当前的f(x),在第二个示例中,您只需要知道f(x),f(x-1)和f(x-2)。
- 如果临时存储需要随着每次调用而增长,并且您无法将其转换为具有固定要求的问题。然后你可以保存到磁盘。如果需求超过您的磁盘容量+其他存储,那么您无法解决它。
- 对于Java,使用Xmx标志允许使用更多RAM。
- 最后,你的示例问题看起来像一个组合问题,所以它很可能有一个不需要递归的数学解决方案,所以它将属于重新制定。如果是这样,请检查
combinatorics
和数学交换。
以上是关于如何处理java中的递归Stack Overflows的主要内容,如果未能解决你的问题,请参考以下文章