如何使用递归将元素从数组1复制到数组2?

时间:2015-06-09 17:53:56

标签: java arrays recursion

我试图使用递归将元素从src(数组1)复制到tgt(数组2)。 Len是一个整数值,用于确定应传输的元素数量。例如,如果len为4,我从数组1中取出4个元素并将它们传输到数组2.

Start是数组src的起始位置,此值将传输到数组tgt的位置start2。然后我递归复制剩余的len-1元素。退出界限异常。

public void arraycopy(double[] src, int start, double[] tgt, int start2, int len){
    if(len < 1) return;
    if(len > src.length) return;

    tgt[start2] = src[start];
    arraycopy(src, start + 1, tgt, start2 + 1, len);

}

4 个答案:

答案 0 :(得分:5)

首先,您不会将len视为要复制的字符数。您将此视为具有以下条件的结束索引:

if(start < len){

您可以将其更改为

if (len > 0)

但此时,len已经大于0,因为基本情况len < 1已经过去了。您可以完全删除if条件。

其次,在递归调用中传递len - 1

arraycopy(src, start+1, tgt, start2+1, len - 1);

第三,如果len大于源数组&#39; s length

if (len > src.length) return;

然后你所做的只是return,导致一个未被复制的数组和一个混乱的调用者。我会完全删除这一行。您可以让Java抛出ArrayIndexOutOfBoundsException,并将其传递给调用者。如果必须执行边界检查,则对源数组和目标数组进行适当的自己测试。

if (start < 0 || start + len > src.length || start2 < 0 || start2 + len > tgt.length) {
    throw new IllegalArgumentException("Out of bounds");
}

答案 1 :(得分:0)

您不必传递两个位置整数。一个就够了。 看看代码。并且还传递实际长度不是(len-1)

public static void arraycopy(double[] src, int start, double[] tgt, int len){
   if (len != src.length) return;
   if (start<len){
         tgt[start] = src[start];
         arraycopy(src, start+1, tgt, len);
   }
} 

答案 2 :(得分:0)

我不得不说我的第一次尝试混入了一些明确的混乱。感谢rgettman ^我能够使我的代码更简洁,让它通过我所有的测试!

public void arraycopy(double[] src, int start, double[] tgt, int start2, int len){
   if (start < 0 || start + len > src.length || start2 < 0 || start2 + len > tgt.length) return;
   if (len > 0){
     tgt[start2] = src[start];
     arraycopy(src, start+1, tgt, start2+1, len-1);
   } 
} 

答案 3 :(得分:0)

公共类RecursiveArrayCopyAlgorithm {

public static void main(String [] args){

    String str = "ABCD";

    char[] chars =  str.toCharArray();

    char[] charElements = new char[chars.length];

    int charLen = chars.length-1;

    int charInitialIndex = 0;

    RecursiveArrayCopyAlgorithm testSearch = new RecursiveArrayCopyAlgorithm();

    char[] charObjs = testSearch.callLinear(charLen, charInitialIndex, chars, charElements);

    for (int i = 0; i < charObjs.length; i++) {         
        System.out.println(charObjs[i]);
    }
}

private char[] callLinear(int charLen, int index,char[] ch, char[] charElements) {
    int index1 = charLen;
    if(index1 < 0) {
        return charElements;
    }

    if(index1 >= 0) {
        charElements[index] = ch[index1];
    }

    return callLinear(charLen-1, index+1, ch, charElements);
}

}