我的Java開發學習之旅------>使用迴圈遞迴演算法把數組裡資料數組合全部列出,------遞迴

來源:互聯網
上載者:User

我的Java開發學習之旅------>使用迴圈遞迴演算法把數組裡資料數組合全部列出,------遞迴

面試題如下:把一個數組裡的數組合全部列出,比如1和2列出來為1,2,12,21。

(面試題出自《Java程式員面試寶典》)

代碼如下:

import java.util.Arrays;import java.util.LinkedList;import java.util.List;/** * 把一個數組裡的數組集合全部列出,比如1和2列出來為1,2,12,21 */public class ListAll {public static void main(String[] args) {String[] array = new String[] { "1", "2", "3" };listAll(Arrays.asList(array), "");}/** * 使用遞迴方法 * @param candidate 遞迴遍曆的List集合 * @param prefix列印出的首碼 */public static void listAll(List<String> candidate, String prefix) {System.out.println(prefix);for (int i = 0; i < candidate.size(); i++) {List temp = new LinkedList(candidate);// 轉換為LinkedList便於安插和移動listAll(temp, prefix + temp.remove(i)); }}}

輸出結果為:

112123131322212132323133131232321

為了便於理解,在迴圈中加一句 System.out.println("candidate is: " + candidate);

public static void listAll(List<String> candidate, String prefix) {System.out.println(prefix);for (int i = 0; i < candidate.size(); i++) {System.out.println("candidate is: " + candidate); // 此行代碼便於理解遞迴List temp = new LinkedList(candidate);// 轉換為LinkedList便於安插和移動listAll(temp, prefix + temp.remove(i)); }}


這樣輸出結果為:
candidate is: [1, 2, 3]1candidate is: [2, 3]12candidate is: [3]123candidate is: [2, 3]13candidate is: [2]132candidate is: [1, 2, 3]2candidate is: [1, 3]21candidate is: [3]213candidate is: [1, 3]23candidate is: [1]231candidate is: [1, 2, 3]3candidate is: [1, 2]31candidate is: [2]312candidate is: [1, 2]32candidate is: [1]321


演算法其實就是現在有幾個數,就先分成幾組,例如[1,2,3]那麼遞迴第一層就是1-[2,3],2-[1,3],3-[1,2]。然後把list傳入繼續遞迴以1-[2,3]為例:又分為2-[3], 3-[2],並且把這些與第一層的1拼接成為12-[3], 13-[2],然後list繼續遞迴下去,這樣就把1開頭的組合都排列完了。2,3開頭的都是同理了。


如果要列印出所有數的組合,如123,132,213,231,312,321

則將listAll方法代碼改為下面

public static void listAll(List<String> candidate, String prefix) {if (candidate.isEmpty()) {System.out.println(prefix);}for (int i = 0; i < candidate.size(); i++) {//System.out.println("candidate is: " + candidate); // 此行代碼便於理解遞迴List temp = new LinkedList(candidate);// 轉換為LinkedList便於安插和移動listAll(temp, prefix + temp.remove(i)); }}

列印結果為:

123132213231312321

去掉注釋後,更加容易理解,列印結果為:

candidate is: [1, 2, 3]candidate is: [2, 3]candidate is: [3]123candidate is: [2, 3]candidate is: [2]132candidate is: [1, 2, 3]candidate is: [1, 3]candidate is: [3]213candidate is: [1, 3]candidate is: [1]231candidate is: [1, 2, 3]candidate is: [1, 2]candidate is: [2]312candidate is: [1, 2]candidate is: [1]321



==================================================================================================

  作者:歐陽鵬  歡迎轉載,與人分享是進步的源泉!

  轉載請保留原文地址:http://blog.csdn.net/ouyang_peng

==================================================================================================


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.