用于计算单词的Java递归方法

时间:2013-02-11 11:12:45

标签: java recursion count words

首先我应该说这是一项令我困惑的作业,我已经纠正了讲师提出的一个问题:/

无论如何,我已经制作了一个方法,使用布尔值,while循环和计数器对单词进行计数。

但是我需要一些如何将它变成一个递归方法来计算字符串中单词的数量,一个单词由一个或多个空格分隔。

countWords(" hello this is an example", 0); // returns 5

正如您所看到的,唯一的参数是countWords(String s,int i),这使得它更加困难。

另外,在方法中我只限于使用这三种方法s.charAt(0),s.substring(1)和s.equals(“”)再次使它更像是一个头疼的人:)< / p>

这是我使用while循环编写的无递归方法:

public static int countWords(String s) {
    int words = 0;
    boolean spaceBefore = true;
    boolean spaceCurrently = false;
    while(true) {
        if (s.equals(""))
            return words;

        if (s.charAt(0) == ' ')
            spaceCurrently = true;
        else
            spaceCurrently = false;

        if (spaceBefore && !spaceCurrently)
            words++;        

        spaceBefore = spaceCurrently;
        s = s.substring(1);
    }
}

3 个答案:

答案 0 :(得分:2)

因为这是一项家庭作业,所以我不会给你代码。但我会向你解释解决方案。看看你是否可以从中重建代码。

在该方法中,首先从行的开头和结尾删除空格,因为我们要忽略它。使用trim()方法。接下来检查字符串是否为空字符串(""),就像在代码中一样。如果是,则返回零,因为空字符串不包含任何单词,否则在无限循环(while (true))中检查以下条件:

  • 创建一个变量来保存当前索引,该索引不是循环的本地索引,而是该方法的本地索引。对于无限循环的每次迭代,检查当前字符(使用charAt()方法)是否不是空格,并且索引是否小于字符串的长度。如果此条件为真,则递增索引变量。
  • 如果不是,请检查索引变量是否等于字符串的长度。如果是,则返回1,因为这意味着我们已经到达字符串的最后一个单词。
  • 如果没有,则返回1的和和方法来计算单词,从索引的当前值递归调用子字符串。

这应该可以获得价值。如果你仍然无法做到,请告诉我,我会给你消息来源。

编辑好吧,如果你不能使用String的trim方法,你可以像这样自己写一个。我相信它并没有违反您的任何要求:

private String trim(String str) {
    int beginIndex = 0;
    int endIndex = str.length() - 1;

    while (true) {
        if (str.charAt(beginIndex) == ' ') {
            beginIndex++;
        } else if (str.charAt(endIndex) == ' ') {
            endIndex--;
        } else {
            break;
        }
    }

    return str.substring(beginIndex, endIndex);
}

编辑2 如果你也不能使用length(),那么修改上面的代码行int endIndex = str.length() - 1;' to int endIndex = getLength(str) - 1;`并使用以下代码计算长度的代码。

private int getLength(String str) {
    int length = 0;

    while (true) {
        try {
            str.charAt(length++);
        } catch (StringIndexOutOfBoundsException e) {
            break;
        }
    }
    return --length;
}

编辑3 由于问题是这样的PITA,因此很难用语言来解释。所以这是代码:

private int countWords(String searchString) {
    int index = 0;
    boolean beginning = true;       // to check if it's the beginning of the line

    if (searchString.equals("")) {
        return 0;
    } else {
        while (true) {
            try {
                if (searchString.charAt(index) != ' ') {
                    beginning = false;
                    index++;
                } else {
                    if (!beginning) {
                        return 1 + countWords(searchString.substring(++index));
                    } else {
                        return countWords(searchString.substring(++index));
                    }
                }
            } catch (StringIndexOutOfBoundsException e) {
                if (!beginning) {
                    return 1;
                } else {
                    return 0;
                }
            }
        }
    }
}

这将帮助您只使用允许使用的方法来实现您想要的效果。

答案 1 :(得分:0)

我不会直接发布代码,因为这是您的作业,但这里有一些指示。

字符串中的单词数是当前单词+字符串其余部分中的单词数。 由于您当时只能处理一个字符,所以您可以这样想:

  • 有一个参数,告诉您是否在单词中
  • 如果s.charAt(0)是一个空格并且你在一个单词中,那么你将增加计数器并将inWord设置为false
  • 如果s.charAt(0)是一个字母但你没有单词那么你将inWord设置为true
  • 使用更新的计数器和s.subString(1)进行递归并更新inWord

你用0,s,假

开始一切

想象一下,将一个循环转换为递归,将变量从循环外部转移到方法参数中。

我希望这不会太混乱。

答案 2 :(得分:0)

鉴于这是家庭作业,我不会直接给你答案。

如果方法调用自身的机制,则递归。显然,如果一个方法不确定地执行此操作,您最终将获得stackoverflow异常,因此您需要某种退出条件,其中该方法停止调用自身。

这是一个例子 - 假设您想要编写一个乘法方法,它采用两个数字并乘以它们,但您只能使用加法和减法。

public int multiply(int value1, int value2) 
{
  if (value1 > 1) 
  {
    int remaining = value1 - 1;
    return value2 + multiply(remaining, value2);
  }
  else 
  {
    return value2;
  }
}

此方法调用自身,直到它将value2添加到自身value1次,此时它将返回堆栈。

你可以做一些类似于你的单词计数的事情 - 继续调用方法将从第一个空格中取出的子字符串传递给字符串的结尾,直到字符串中没有更多的空格来返回堆栈。