我正在为一个类做一个任务,但我不确定为什么我为这两个方法编写的代码不起作用。
对于第一种方法,我试图将数组中的当前位置与下一个方法进行比较,如果下一个更大,则它变为最大。另外,当前位置的int变得最大。在使用递归方法调用遍历数组之后,它将返回数组中最大的int。
// This method takes an integer array as well as an integer (the starting index) and returns the largest number in the array.
public int largestRec(int[] arr, int pos)
{
// TODO: implement this method
int largest = arr[pos];
if(pos == arr.length-1)
{
return largest;
}
else
{
if(arr[pos] < arr[pos+1])
{
largest = arr[pos+1];
}
else
{
largest = arr[pos];
}
pos++;
largestRec(arr, pos);
}
return largest; // replace this statement with your own return
}
第二种方法。我想要做的是让它通过递归方法调用传递一个较小版本的字符串,然后当测试类调用该方法时,它将打印出字符串的反向。
// This method reads a string and returns the string in the reversed order.
public String reverseStringRec(String s)
{
// TODO: implement this method
String reverse;
int pos = 0;
if(s=="" || s.length() <= 1)
{
return s;
}
else
{
reverse = reverseStringRec(s.substring(1)) + s.charAt(0);
}
return reverse; // replace this statement with your own return
}
我不确定如何编写代码来实现它(对于赋值,我只能修改方法,而不允许外部变量/方法/类),所以我很感激任何建议/帮助你可以提供。如果您需要更多信息,我很乐意提供。感谢。
编辑: 我的问题是第一种方法没有返回最大的方法。对于我的测试数组,它通常打印第一个int或第二个int(如果它大于第一个,但不检查其余的)。对于第二个,我的测试类(由我的教授制作)给出消息'字符串索引超出范围“,我不知道如何解决这个问题。 我查看了杰森的建议,并提出了建议的解决方案,但似乎并不适合我的情况。
Edit2:现在可以使用新版本的reverseStringRec()。现在我需要修复largestRec()。如果有人可以提供任何帮助,问题仍然存在。
Edit3:虽然我修复了reverseStringRec(),但有人给出了一个包含for循环的答案。我没有提到我不能使用循环进行此任务,所以我为此带来的不便表示歉意。如果您需要查看它现在产生的结果,我会将当前maximumRec()的输出放在下面。
测试3:最大(10)==&gt; [传递] 预计:10 你的:10
测试4:最大(10,20,30,40,50,60)==&gt; [失败] 预计:60 你的:20
测试5:最大(70,20,30,40,50,10)==&gt; [传递] 预计:70 你的:70
测试6:最大(70,20,100,40,50,10)==&gt; [失败] 预计:100 你的:70
Edit4:找到两种方法的解决方案。对于largestRec(),请查看下面提供的解决方案。对于reverseStringRec(),您可以使用此帖子中的一个或下面建议的那个。
答案 0 :(得分:1)
马上,第二种方法存在一个相当明显的问题。在其中,您递归调用方法reverseString,并且该参数是子字符串。但是,在这个子字符串中,你试图使子字符串比原始参数更长,s - 本质上,通过包含s.length()+ 1,substring()方法尝试创建一个子句字符串,其索引为s .length()+ 1,不存在。
为了实际反转方法的String输入,我强烈建议使用charAt()方法。
答案 1 :(得分:0)
对于使用递归方法反转String,您可以这样做:public
static String reverseStr(String str) {
if (str.length() == 1)
return str;
else
return str.charAt(str.length()-1) + reverseStr(str.substring(0, str.length()-1));
}
public static void main(String[] args) {
System.out.println(reverseStr("String to be reversed"));
}
另一种简单的方法来反转String(不是递归的):
public static String reverseStringRec(String s) {
String reverse = "";
int pos = 0;
for (int i = s.length()-1; i >= 0; i--) {
reverse += s.charAt(i);
pos++;
}
return reverse;
}
public static void main(String[] args) {
System.out.println(reverseStringRec("String to be reversed"));
}
对于问题的第一部分,这是解决方案:
static int findMax(int[] arr, int length) {
if (length == 1) {
return arr[0];
}
return max(findMax(arr, length - 1), arr[length - 1]);
}
private static int max(int num1, int num2) {
return num1>num2 ? num1 : num2;
}
public static void main(String[] args) {
int[] arr = {10, 20, 3, 55, 200, 33};
System.out.println(findMax(arr, arr.length));
}
答案 2 :(得分:0)
查看找到最大数字并反转字符串的这些方法。你的解决方案非常接近。这就是我实现这些的方法。你需要在索引中跟踪数组最大的数字,否则你可以做的是传递第一个数字并假设它是最大的,每次你找到最大的数字替换它,一旦你到达数组的末尾你返回最大。
{
"apiVersion": "1.0",
"swaggerVersion": "1.2",
"basePath": "http://localhost:3000",
"resourcePath": "users",
"apis": [
{
"path": "/api/v1/users.json",
"operations": [
{
"summary": "Returns list of users",
"notes": "/api/v1/users",
"nickname": "Api::V1::Users#index",
"method": "get"
}
]
},
{
"path": "/api/v1/users/{id}.json",
"operations": [
{
"summary": "Returns a user",
"notes": "/api/v1/users/:id",
"parameters": [
{
"paramType": "path",
"name": "id",
"type": "integer",
"description": "User Id",
"required": false
}
],
"nickname": "Api::V1::Users#show",
"method": "get"
}
]
}
],
"authorizations": null
}