使用递归来清除Java中的一维数组?

时间:2016-04-29 20:30:01

标签: java arrays recursion

我正在尝试学习递归,这对我来说是一个很滑的概念。我使用递归来处理原始数据类型和字符串,从而完成了许多玩具练习。但现在我转向使用递归和数组,在这里我很难过。我希望有人可以帮我解决这个问题的第一步(<)。

以下是挑战:使用递归将1D int []数组中的所有元素设置为所有0&#39; s。不允许循环。从概念上讲,我认为解决方案是:

method clearArray(int[] array)
    Check for base case:  Is array of size 1?
    IF YES:  return array
    IF NO:
       (-) Create array2, size one less than original array
       (-) Set first element of array2 to "0"
       (-) Then recursively call clearArray(array2)

在纸面上,这看起来很棒。这是实际的实现:

public class RecursiveEx{
    public static void main(String[] args){
        int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8 };
        printArray(clear(arr));
    }

    public static int[] clearArray(int[] arr){
        if(arr.length==1){
            return arr;
        }
        else{
            int[] arr2 = new int[arr.length-1];
            arr2[0]=0;
            return clearArray(arr2);
        }
    }

返回一个大小为1的数组,设置为&#34; 0&#34;。不好。问题在于,当代码递归地将数组切割为一个元素时,它不会将原始数组构建回原始大小;我不知道如何附加子阵列。

使用String这很容易。但String对象允许使用易于使用的串联和子串方法。我无法弄清楚数组等价物是什么。

完全披露:我正在罗格斯大学学习Java 101课程,是的,这是他们使用递归和数组为我们提供的几个编程练习中的第一个。它不是为了信用。我希望如果有人能帮助我开始这个初步练习,我可以看到我出错的地方,然后淘汰其他人。

有没有人有一些建议或建议?任何事情都会受到赞赏。

非常感谢! -RAO

3 个答案:

答案 0 :(得分:1)

最好的方法是将数组保留为参数,因此您始终拥有其引用,以及当前索引以跟踪最后清除的元素。

我没有测试过这个方法,但它是这样的:

void clearArray(int[] arr, int index) {
   if (index >= 0) {
       arr[index] = 0;
       clearArray(arr, index - 1);
   }
}

您拨打电话clearArray(arr, arr.length - 1);

答案 1 :(得分:1)

为此,我建议您递归调用一个index值的辅助函数(每次递增),以及目标数组。基本情况是你的索引等于数组的长度 - 不做进一步的更改,然后返回。

代码可能类似于:

import java.util.Arrays;

public class RecursiveEx {

    public static void main(String[] args) {
        int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8 };
        clearHelper(0, arr);
        System.out.println(Arrays.toString(arr));
    }

    public static void clearHelper(int index, int[] arr) {
        if (arr.length == index) {
            return;
        }
        arr[index] = 0;
        clearHelper(index + 1, arr);
    }

}

不使用循环的另一种厚颜无耻的方式:arr = Arrays.stream(arr).map(i -> 0).toArray();

答案 2 :(得分:1)

一般来说,像递归一样重新思考你的想法

  1. 你的意见是什么?将输入“减少”为更小的部分需要采取哪些步骤?每个“步骤”需要做什么操作?
  2. 您可以获得的最小可能输入是多少?将其作为基本情况(何时停止递归)。
  3. 给定一些输入,从某些当前状态开始针对您的基本情况,并可能使用从递归调用接收的结果。
  4. 话虽如此,您的输入是一个数组,并且数组具有length属性,您可以将它们编入索引。如果你保持对整个数组的引用,并在任一端开始索引,那么你可以通过递增/递减索引,并将该位置的数组设置为零来有效地向另一端递归。

    在伪代码中(在数组中向后)

    func clearArray(A[], n):
        if n < 0:
            return
        A[n] = 0
        clearArray(A[], n - 1)
    
    arr = A[]
    clearArray(arr, arr.length)