2015-06-09 49 views
0

我想使用遞歸將元素從src(數組1)複製到tgt(數組2)。 Len是一個整數值,它決定了應該傳送多少個元素。例如,如果len是4,我從Array 1中取出4個元素,並將它們傳送到Array 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); 

} 
+2

你可以擴大「無所事事」嗎? –

+1

除了成爲最低效率的方法之一之外,您是否考慮過開始位置大於複製長度的情況?考慮一個100元素數組,從元素50開始複製10個元素將導致方法「無所事事」,因爲'start'已經大於或等於'len'開頭。 – initramfs

+0

@BCronyn你想從SO中獲得什麼?功能(遞歸函數)或全面證明方法(驗證和東西).. – ha9u63ar

回答

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大於源陣列的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"); 
} 
+0

完美 - 我得到它的工作感謝您的評論。我明顯誤解了len的輸入。 ......而len-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); 
    } 
} 
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); 
    } 
} 
相關問題