当前位置: 首页 > 知识库问答 >
问题:

Java递归计数法

席俊
2023-03-14

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

不管怎样,我已经做了一个方法,它使用布尔值、一个当循环和一个计数器来计算单词。

然而,我需要了解如何将其转化为一个递归方法,计算字符串中的单词数量,一个单词由一个或多个空格分隔。

countWords(“你好,这是一个例子”,0);//返回5

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

此外,在该方法中,我仅限于使用这三种方法:s.charAt(0)、s.substring(1)和s.equals(“”),这也让它更像是一个头部伤害:)

这是我写的无递归方法,使用的是当循环:

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个答案

巫研
2023-03-14

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

递归是一种方法调用自身的机制。显然,如果一个方法不确定地这样做,你最终会得到一个stackoverflow异常,所以你需要某种退出条件,在这种条件下,该方法停止调用自己。

这里有一个例子——假设你想写一个乘法方法,将两个数字相乘,但你只能使用加法和减法。

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

在这里,方法调用自己,直到它将value e2添加到自己value e1中,此时它返回堆栈。

你可以做一些与你的字数计算类似的事情——继续调用这个方法,将一个子字符串从第一个空格传递到字符串的末尾,直到字符串中没有更多的空格,然后返回堆栈。

卜昂熙
2023-03-14

我不会直接发布代码,因为这是你的作业,但这里有一些方向。

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

  • 有一个参数,告诉你是否在一个单词中
  • 如果s.charAt(0)是一个空格,并且你在一个单词中,那么你将增加计数器并将inWord设置为false
  • 如果s.charAt(0)是一个字母,而你不在一个单词中,那么你将inWord设置为true
  • 递归与更新的计数器和s.sub字符串(1)和更新在Word

你用0,s,假开始一切

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

我希望这不会太令人困惑。

欧阳翔
2023-03-14

既然这是家庭作业,我就不给你密码了。但我会向你解释解决方案。看看是否可以从中重建代码。

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

  • 创建一个变量来保存当前索引,它不是循环的局部索引,而是方法的局部索引。对于无限循环的每次迭代,检查当前字符(使用charAt()方法)是否不是空格,以及索引是否小于字符串的长度。如果此条件为真,则增加索引变量

这应该会给你带来价值。如果你仍然无法做到这一点,让我知道,我会给你的来源。

编辑好如果你不能使用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如果您也不能使用long(),那么将上面的代码行int endIndex=str.length()-1;'修改为int endIndex=getLlong(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:实现一个int方法max(int[]arr,int i),该方法返回arr中所有元素的最大值和索引 这是我迄今为止的代码: 实际上它是有效的,但它的风格很差,所以我的问题是:如果没有私有静态int max,我如何实现递归方法?我不允许向该方法添加第三个参数。 任务2:实现一个布尔方法包含值(int[]arr,int val),如果a

  • 定义一个接受1个参数的count_down函数。当你调用count_down(3)时,输出应该是这样的:3...2...1...0!。 我的代码如下: 但是输出是[3,2,1,0][4,3,2,1,0]如何获得如所讨论的格式所描述的格式:3...2...1...0!

  • 我在codingbat上做这个问题,我的解决方案没有通过那里的所有测试。问题是递归地返回给定数中8的数目。如果有两个连续的8,那么您必须添加一个额外的。(例如,818=>2;88=>3)我在这里复制了Python中的代码,它似乎可以工作。我的代码在下面。 来自上面代码的测试结果:

  • 我需要使用这个方法: 然后使用递归计算存储在数组中的最大数、负数的计数以及正数的和。因此,您将在Assignment9类中创建递归方法findMax、countNegative和ComputeSum积极,它们将由main方法调用。 具体来说,必须实现以下递归方法(这些方法不应包含任何循环): 在数组中 如果我能算出这个负的,我就能算出计算的正的。 计数可以是你需要的任何东西。我把它更多地用作Fin

  • 我的问题是,当一个9不能正确添加时,该方法会中断。不知何故,我不知道如何让它回到前一点,并向上数,这将创建一个新的“路径”,所以我想如果我做对了,一切都应该很好。我仍然在使用递归:-/ 正如我所知,我认为Sudokurecrect()做了它应该做的事情。编辑:您可以忽略布尔测试。我知道我不使用它,我试着想一些东西,但显然我不知道如何使用它。 输出为 在那之后,不管检查哪个变体。所以问题是一样的。