第七届蓝桥杯省赛--抽签

一、问题描述


  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行)

 1 public class A
 2 {
 3     public static void f(int[] a, int k, int n, String s)
 4     {
 5         if(k==a.length){ 
 6             if(n==0) System.out.println(s);
 7             return;
 8         }
 9         
10         String s2 = s;
11         for(int i=0; i<=a[k]; i++){
12             _____________________________;   //填空位置
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 }

  仔细阅读代码,填写划线部分缺少的内容。注意:不要填写任何已有内容或说明性文字。

 

二、题目类型:代码填空、递归

 

三、解题思路及答案

  第一眼,我竟然没往递归那里想。。。递归出口就在那里,而你却视而不见。。。

  确定了题目给出的是个递归方法,解题就很简单了,就是抓住递归出口,修改方法的参数。一开始我填的是:f(a,k++,n-1,s2),只能说明我der,巨der。首先,直接k++就已经改变了k的原始值,人家代码下面还有:s2 += (char)(k+'A'); 这还不溢出???其次,直接简单的想下一次的需要人数就是n-1,你把我循环的 i 放在哪里?

  答案:f(a,k+1,n-i,s2)

上一篇:好用的系统扫描和清理工具推荐:OS Cleaner Pro for Mac


下一篇:effective解读-第八条 避免使用finalizer和Cleaner