题目
/*抽签
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 classMain {2 public static void f(int[] a, int k, intn, 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 voidmain(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, intn, 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 classMain {2 public static void f(int[] a, int k, intn, 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 voidmain(String[] args)18 {19 int[] a = {4,2,2,1,1,3};20
21 f(a,0,5,"");22 }23 }