如何在java中编写递归方法来反转存储在整数数组中的值?

时间:2015-03-31 04:08:59

标签: java arrays recursion computer-science reverse

我很难找到如何反转存储在整数数组中的值这个代码:

private static void randomizeArray (int[] arr, int upperLimit)

{
// Loop to generate and store in array random numbers from 1 to upperLimit

    Random rand = new Random();

    for (int i = 0; i < arr.length; i++)

        arr[i] = rand.nextInt(upperLimit) + 1;

}

private static void printArray (String heading, int[] arr)

{

    // Loop to print array numbers

    System.out.print(heading + ": [");

    for (int i = 0; i < arr.length; i++)

    System.out.printf("%3d", arr[i]);

    System.out.println("]");

}

private static int[] reverseArray (int[] arr)

{


}

}

5 个答案:

答案 0 :(得分:1)

做这样的事情:

 void reverseArray(int[] arr) {
   reverse(arr, 0, arr.length - 1);
}

void reverse(int[] arr, int s, int e) {
    if(s < e) {
       /* swap start and end index elements */
       int tmp = arr[s];
       arr[s] = arr[e];
       arr[e] = tmp;
       reverse(arr, ++s, --e);
    }   
}

递归,不需要任何额外的缓冲区并在O(n)中运行。

迭代版本可以是这样的:

int[] reverseArray(int[] arr) {
    int startIndex = 0, endIndex = arr.length - 1;
    for (int i=startIndex; i<endIndex/2; i++) {
        int tmp = arr[i];
        arr[i] = arr[endIndex-i];
        arr[endIndex-i] = tmp;
    }
    return arr;
}

答案 1 :(得分:0)

private static int[] reverseArray (int[] arr)

{
    if(arr.length == 1){
        return arr;
    }
    else{
        int temp = arr[0];
        int tempArr[] = new int[arr.length-1];
        System.arraycopy(arr, 1, tempArr, 0, tempArr.length);
        tempArr = reverseArray(tempArr);
        System.arraycopy(tempArr, 0, arr, 0, tempArr.length);
        arr[arr.length-1] = temp;
        return arr;
    }
}

答案 2 :(得分:0)

要创建递归算法,您需要做两件事。

基础案例

你可以合理地遇到的最小的案例是什么,结果应该是什么?

空数组是它自己的反转。不能小于此。

rev([])= []

根据下一步,您可能还需要将单例案例定义为基本案例:

rev([r])= [r]

归纳步骤

给定一个函数rev n ,适用于“size”&lt; = n 的任何输入,用于“size”的某些合适定义“,您可以使用该函数为”size“ n + 1的任何输入生成结果吗?

rev([r 1 ,...,r n ,r n + 1 ])= [r n +1 ] ++ rev n ([r < sub> 1 ,...,r n ])

或(假设单例情况也被定义为基本情况)

rev([r 1 ,...,r n ,r n + 1 ])= [r n +1 ] ++ rev n ([r < sub> 2 ,... r n ])++ [r 1 ]

答案 3 :(得分:0)

为了编写一个反转数组的递归程序,你需要:

一个。将第一个元素与数组的最后一个元素交换

湾呼叫     上面的子数组没有第一个和最后一个元素

℃。停止调用 - 如果没有要交换的元素

考虑以下代码

void reverseArray(int arr[], int start, int end){
   int temp;
   if(start >= end)
     return;
   temp = arr[start];   
   arr[start] = arr[end];
   arr[end] = temp;
   rvereseArray(arr, start+1, end-1);   
} 

此代码不完全适合您的模板,您需要调整它以返回int []

答案 4 :(得分:-1)

有很多方法可以做到这一点。使用Stack非常容易,但是通过将值存储在临时数组中,还有另一种简单的方法。基本上你使用j作为指向arr数组中最后一个点的指针,并加载tempArray前面的任何值。在循环的每次迭代之后,我们递减j并递增i,改变它们的指针以继续将arr的值以相反的顺序放入tempArray中。希望有所帮助。

private static int[] reverseArray (int[] arr)
{
    int[] tempArray = new int[arr.length];
    int j = arr.length-1;
    for(int i = 0; i < arr.length; i++){
        tempArray[i] = arr[j];
        j--;
    }
    return tempArray;
}