慕標(biāo)琳琳
2019-03-20 18:15:54
1、第一種import java.util.Arrays;public class Main { public static void main(String[] args) { int[] a = new int[] { 1, 2, 3, 4 }; f(a, 0, a.length - 1); } public static void f(int[] a, int start, int end) { if (start >= end) { System.out.println(Arrays.toString(a)); return; } for (int i = start; i <= end; i++) { int temp = a[start]; a[start] = a[i]; a[i] = temp; f(a, start + 1, end); temp = a[start]; a[start] = a[i]; a[i] = temp; } }}第二種import java.util.Arrays;public class Main { public static void main(String[] args) { int[] a = new int[4]; boolean[] vis = new boolean[5]; f(a, 0, vis); } public static void f(int[] a, int k, boolean[] vis) { if (k >= a.length) { System.out.println(Arrays.toString(a)); } for (int i = 1; i <= a.length; i++) { if (!vis[i]) { a[k] = i; vis[i] = true; f(a, k + 1, vis); vis[i] = false; } } }}第三種import java.util.Arrays;public class Main { public static void main(String[] args) { int[] a = new int[4]; boolean[] vis = new boolean[4]; f(a, 1, vis); } public static void f(int[] a, int k, boolean[] vis) { if (k > a.length) { System.out.println(Arrays.toString(a)); return; } for (int i = 0; i < a.length; i++) { if (!vis[i]) { a[i] = k; vis[i] = true; f(a, k + 1, vis); vis[i] = false; } } }}
1 回答

交互式愛情
TA貢獻(xiàn)1712條經(jīng)驗(yàn) 獲得超3個贊
除第一種是對數(shù)組的元素進(jìn)行全排列, 其余的都是對數(shù)組邊賦值邊進(jìn)行排列的, 所以后面三種其實(shí)說是對"數(shù)組進(jìn)行全排列"這種說法并不對, 只不過是下標(biāo)剛好是和數(shù)值一樣了
對全排列的基本思想都是一樣的, 使用遞歸前保存原來的狀態(tài), 遞歸彈出后恢復(fù).
結(jié)果不一樣是因?yàn)閷[i]的賦值不同, 第二種是a[i] = i, 三四種a[i] = k;
第四種的相當(dāng)于二三種的簡化,vis的標(biāo)記位與a數(shù)組合并了, 但是這樣不能對{0, 1, 2}這種數(shù)組進(jìn)行全排列了, 因?yàn)?相當(dāng)于未訪問意思了
第一種的end完全可以不用傳, 本質(zhì)就是數(shù)組長度
添加回答
舉報
0/150
提交
取消