【发布时间】:2011-12-13 20:40:33
【问题描述】:
我正在为一个使用StringBuilder 生成字符串的所有排列的Android 应用程序用Java 编写一个函数。
每当函数运行时,程序都会立即终止,并且 DDMS(Dalvic 虚拟机调试工具)在我的函数中声明堆栈溢出。
private void reorder(String reorder_this, StringBuilder in_this){
for(int i = 0; i < reorder_this.length(); i++)
{
if(i == reorder_this.length())
{
in_this.append(System.getProperty("line.separator"));
}
else
{
in_this.append(reorder_this.charAt(i));
reorder(reorder_this.substring(0, i) + reorder_this.substring(i), in_this);
}
}
}
您可以看到我对这个问题采用了递归方法,我相信这最终会用输入字符串的所有可能排列填充字符串构建器,每个排列后跟换行符。
有人知道什么可能导致堆栈溢出吗?
【问题讨论】:
-
您是否使用小字符串(如“ABC”)跟踪执行情况? (我的意思是“用手”追踪,或者在紧要关头,记录……但“玩电脑”真的很有帮助。)
-
我在嵌套的 for 循环中找到了一个更有效的解决方案。我最近一直在使用方案,并且一直停留在递归范式中。
-
非尾递归函数通常效率较低;递归经常因为它的通信方式而发光,而不一定是它的执行方式。
标签: java android recursion stack-overflow