首先,我应该说这是一个让我困惑的作业,我已经纠正了讲师的一个问题:/
不管怎样,我已经做了一个方法,它使用布尔值、一个当循环和一个计数器来计算单词。
然而,我需要了解如何将其转化为一个递归方法,计算字符串中的单词数量,一个单词由一个或多个空格分隔。
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);
}
}
鉴于这是家庭作业,我不会马上给你答案。
递归是一种方法调用自身的机制。显然,如果一个方法不确定地这样做,你最终会得到一个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
中,此时它返回堆栈。
你可以做一些与你的字数计算类似的事情——继续调用这个方法,将一个子字符串从第一个空格传递到字符串的末尾,直到字符串中没有更多的空格,然后返回堆栈。
我不会直接发布代码,因为这是你的作业,但这里有一些方向。
字符串中的单词数是字符串其余部分的当前单词数。因为您一次只能处理一个字符,所以可以这样想:
你用0,s,假开始一切
想象一下,将循环转换为递归,将变量从循环外部移动到方法参数中。
我希望这不会太令人困惑。
既然这是家庭作业,我就不给你密码了。但我会向你解释解决方案。看看是否可以从中重建代码。
在该方法中,首先删除行的开头和结尾的空格,因为我们想忽略它。使用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()做了它应该做的事情。编辑:您可以忽略布尔测试。我知道我不使用它,我试着想一些东西,但显然我不知道如何使用它。 输出为 在那之后,不管检查哪个变体。所以问题是一样的。
我通过