題目
/* 抽簽 X星球要派出一個5人組成的觀察團前往W星。 其中: A國最多可以派出4人。 B國最多可以派出2人。 C國最多可以派出2人。 .... 那么最終派往W星的觀察團會有多少種國別的不同組合呢? 下面的程序解決了這個問題。 數組a[] 中既是每個國家可以派出的最多的名額。 程序執行結果為: DEFFF CEFFF CDFFF CDEFF CCFFF CCEFF CCDFF CCDEF BEFFF BDFFF BDEFF BCFFF BCEFF BCDFF BCDEF .... (以下省略,總共101行) public class A { public static void f(int[] a, int k, int n, String s) { if(k==a.length){ if(n==0) System.out.println(s); return; } String s2 = s; for(int i=0; i<=a[k]; i++){ _____________________________; //填空位置 s2 += (char)(k+'A'); } } public static void main(String[] args) { int[] a = {4,2,2,1,1,3}; f(a,0,5,""); } } 仔細閱讀代碼,填寫划線部分缺少的內容。 注意:不要填寫任何已有內容或說明性文字。 */
答案
f(a,k+1,n-i,s2)
代碼
1 public class Main { 2 public static void f(int[] a, int k, int n, String s) 3 { 4 if(k==a.length){ 5 if(n==0) System.out.println(s); 6 return; 7 } 8 9 String s2 = s; 10 for(int i=0; i<=a[k]; i++){ 11 f(a,k+1,n-i,s2); //填空位置 12 s2 += (char)(k+'A'); 13 } 14 } 15 16 public static void main(String[] args) 17 { 18 int[] a = {4,2,2,1,1,3}; 19 20 f(a,0,5,""); 21 } 22 }
分析
這是一道很基礎的循環遞歸題目,代碼寫的很精巧,但是也有沒考慮到的地方,先說代碼思路
1 public static void f(int[] a, int k, int n, String s) 2 { 3 if(k==a.length){ 4 if(n==0) System.out.println(s); 5 return; 6 } 7 8 String s2 = s; 9 for(int i=0; i<=a[k]; i++){ 10 f(a,k+1,n-i,s2); //填空位置 11 s2 += (char)(k+'A'); 12 } 13 }
數組a是用來存儲各個國家可以派遣的人數, 方法 f(int[] a, int k, int n, String s) 其中int[] a指代數組a,變量k 指代國家索引,變量n 指代當前已經選出的人數,變量s 指代 一個選出的用字符串表示的情況
for循環,循環當前國家(a[k])的情況,並用s2存下來,然后k+1遞歸進入下一個國家(索引值),n-i 表示還需要派遣的人數,s2表示存儲的當前情況。
代碼改進
這個代碼沒有考慮當派遣的人數大於5的情況,這個情況時應該讓代碼跳出遞歸,改進的代碼
1 public class Main { 2 public static void f(int[] a, int k, int n, String s) 3 { 4 if(k==a.length){ 5 if(n==0) System.out.println(s); 6 return; 7 } 8 if(n<0)return;//改進的地方 9 String s2 = s; 10 for(int i=0; i<=a[k]; i++){ 11 f(a,k+1,n-i,s2); //填空位置 12 // System.out.println("-----"+s2+"------"); 13 s2 += (char)(k+'A'); 14 } 15 } 16 17 public static void main(String[] args) 18 { 19 int[] a = {4,2,2,1,1,3}; 20 21 f(a,0,5,""); 22 } 23 }