有点新的递归方法&我不确定为什么这不起作用

时间:2016-03-04 01:07:34

标签: java arrays recursion

我正在为一个类做一个任务,但我不确定为什么我为这两个方法编写的代码不起作用。

对于第一种方法,我试图将数组中的当前位置与下一个方法进行比较,如果下一个更大,则它变为最大。另外,当前位置的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(),您可以使用此帖子中的一个或下面建议的那个。

3 个答案:

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