递归方法导致Java程序中的堆栈溢出

时间:2015-12-07 15:21:57

标签: java recursion

所以我的程序的前提是它是一个JavaFX GUI,它将显示" analysis"的结果。

我有6种不同的字符串,范围从长度1到长度3

String[] phrases = new String[] { "ar", "ne", "um", "ll", "r", "ose" };

以及我只使用名称(String value)的对象的arrayList。

到目前为止,我已经能够设置循环,输入数据以显示GUI。

private void analyzePlantMenu(ArrayList<Plant> plants)
{
    String[] phrases = new String[] { "ar", "ne", "um", "ll", "r", "ose" };
    BorderPane sects = new BorderPane();

    String current = "";
    TextArea analysis = new TextArea();

    for (Plant myplant : plants)
    {
        current = myplant.getName();
        for (int q = 0; q < phrases.length; q++)
        {
            String trial = phrases[q];
            analysis.appendText("The number of times " + phrases[q] + " appeared in the word " + current + " were "
                    + compareTrials(trial, current) + "\n");
        }
    }

我遇到的麻烦是为 compareTrials

返回正确的值

这是我到目前为止的递归方法

private int compareTrials(String trial, String current)
{
    int shift2 = 0 + trial.length();
    int shift = 0;
    if (shift == current.length())
    {
        return 0;
    }
    else if (current.substring((shift), (shift2)).contains(trial))
    {
        shift2 += 1;
        shift += 1;
        return 1 + compareTrials(trial, current);
    }
    else
    {
        shift2 += 1;
        shift += 1;
        return 0 + compareTrials(trial, current);
    }
}

有人可以帮助我理解为什么我在迭代这个词时会出现堆栈溢出错误吗?

我最好的猜测是因为我的基本情况不是基本情况,或者我的其他声明是以无限期的方式继续

修改

我改变方法以检测这些值而没有进入堆栈溢出的方法涉及将多个变量移到 compareTrials 方法之外并将其传入。化妆品更改和下面编辑的代码

private void analyzePlantMenu(ArrayList<Plant> plants)
{
    String[] phrases = new String[] { "ca", "in", "us", "ll", "r", "ose" };
    BorderPane sects = new BorderPane();

    String current = "";
    TextArea analysis = new TextArea();

    for (Plant myplant : plants)
    {
        current = myplant.getName();
        for (int q = 0; q < phrases.length; q++)
        {
            String trial = phrases[q];
                **int total = 0;
                int shift2 = trial.length();
                int shift = 0;**
            analysis.appendText((q+1) + ". The number of times " + phrases[q] + " appeared in the word " + current
                    + " were " + compareTrials(trial, current, shift, shift2, total) + "\n");
        }
        analysis.appendText("Finished analysis of " + current.toUpperCase() + "\n");
        analysis.appendText("\n");
    }

和递归方法

private int compareTrials(String trial, String current, int shift, int shift2, int total)
{
    if (shift2 >= current.length() + 1)
    {
        System.out.println(shift + " " + shift2);
        return total += 0;
    }
    else if (current.substring((shift), (shift2)).equalsIgnoreCase((trial)))
    {
        System.out.println(shift + " " + shift2);
        return total += 1 + compareTrials(trial, current, shift + 1, shift2 + 1, total);
    }
    else
    {
        System.out.println(shift + " " + shift2);
        return total += 0 + compareTrials(trial, current, shift + 1, shift2 + 1, total);
    }
}

3 个答案:

答案 0 :(得分:4)

你的两个递归电话,

    return 0 + compareTrials(trial, current);

trial

参数传入参数完全相同。 currentcompareTrials()永远不会改变。 因此,你不能指望它收敛,因此只需用相同的参数调用.field无限次。

答案 1 :(得分:1)

我相信您的问题源于每当您递归调用compareTrials()时。基本上你在每个返回方法中所做的只是使用相同的方法参数再次调用递归方法。所以它只是一个无限的“循环”。

我首先重新定义trialcurrent,然后使用这些修改过的参数调用compareTrials()方法。

答案 2 :(得分:1)

根据我对你的需求的理解,我会用这样的东西来进行递归方法:

private int compareTrials(String trial, String current, int startIndex) {
    int nextIndex = current.indexOf(trial, startIndex);
    if(nextIndex == -1) {
        return 0;
    }
    return 1 + compareTrials(trial, current, nextIndex + trial.length());
}

第一个电话会是startIndex 0