2016年ブルーブリッジカップjava-抽選


X星は5人で構成された観察団をW星に派遣する.このうち、A国は最大4人まで派遣できる.B国は最大2人まで派遣できる.C国は最大2人まで派遣できる....では、最終的にW星に派遣される観察団には、いくつの国別の組み合わせがあるのだろうか.次のプログラムはこの問題を解決しました.配列a[]では、国ごとに最も多くの定員を派遣することができる.プログラム実行結果:DEFFF CEFFF CDFFF CDEFF(以下省略、合計101行)
package com.ying.keepup;

public class chouqian05 {
    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++){
            f(a,k+1,n-i,s2);   //    
            s2 += (char)(k+'A');
        }
    }

    public static void main(String[] args)
    {
        int[] a = {4,2,2,1,1,3};    
        f(a,0,5,"");
    }
}

小結:これは基礎的な再帰コードサイクルで、ブルーブリッジカップは毎年このような再帰のテーマを出すような気がします.まずパラメータ:int[]aは国ごとに派遣できる最小定員を指し、変数kは国インデックスを指し、変数nはまだ選択する必要がある人数を指し、変数sは選択した文字列で表す場合を意味する.
再帰はいつ使えますか?1つの単一の関数が現れることに注意して警戒し始めて、しかももっとよくこの関数を理解するためにあなたのやり方は関数のパラメータが一つ一つすべてはっきり理解しなければなりません!!!(関数は出ないほうがいい、パラメータは変数がいい)