我试图使用递归将元素从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);
}
答案 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);
}
}