题目
/* 抽签 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 }