我的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
==================================================================================================