打靶尝试递归算法三解。

来源:互联网 发布:猎场网络更新时间 编辑:程序博客网 时间:2024/05/04 15:21
面试例题1一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能性有多少种?请用递归算法编程实现。[中国某著名通信企业H面试题]


问题所在原文http://book.csdn.net/bookfiles/107/1001073091.shtml。


我自己和同事想自己做做看。我用了几乎3个小时的时间才算弄出来,实在应该多多思考,多多练习。
我的程序如下:
package digui;

public class daba {
   
    public int sum = 0 ;
   
    /**
     *
     * @param time 总共可以尝试的次数.
     * @param score time次要求获得的环数.
     * @return time次完成score分数的可能情况数.
     */
    public int f(int time,int score){
        int all = 0;
        if(score/time>10)
            return 0 ;
        if(time==1)
            return 1 ;
        for (int i = 0; i <= 10; i++) {
             int tmp = f(1,i)*f(time-1,score-i);
             if(tmp>=1)
             all += tmp;
        }
        return all;
    }
   
    /**
     *
     * @param time 总次数
     * @param score time次数所要求达到得环数
     * @param arr 每次所中得环数.
     */
    public void f2(int time,int score,int[] arr){
    //    System.out.println("time="+time+",score="+score);
        if(score/time>10)
            return ;
        if(time==1){
            arr[0]=score;
            output(arr);
            return ;
        }
        for (int i = 0; i <= 10; i++) {
             arr[time-1] = i ;
             f2(time-1,score-i,arr);
        }
    }
   
    private void output(int[] arr) {
        String result = "" ;
        for (int i = 0; i <= 9; i++) {
            result+=arr[i]+" ";
        }
        System.out.println(result);
        sum++;
       
    }


    public daba() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        daba obj = new daba();
        //System.out.println(obj.f(10,90));;
        int[] arr = new int[10];
        obj.f2(10,90,arr);
        System.out.println(obj.sum);
    }

}
======================= 以上是我的程序=======下面是书中的解法============
package digui;

public class daba2 {

    // public static int[] store;

    // 相当于设置了全局变量

    // 这个全局变量sum是包含在M类中的

    public static int sum;

    public daba2()

    {
        int sum = 0;
        // int[] store = {1,2,3,4,5,6,7,8,9,0};
    }

    // 打印函数

    // 符合要求的则把它打印出来

    public static void Output(int[] store2) {

        String result = "" ;
        for (int i = 9; i >= 0; --i) {
            //System.out.print(store2[i]+" ");
            result+=store2[i]+" ";
        }
        System.out.println(result);
        sum++;
    }

    // 计算总数,返回sum值
    public static int sum2() {
        return sum;
    }

    public static void Cumput(int score, int num, int[] store2)

    {

        // 如果总的成绩超过了90环(也就是score<0),或者如果剩下要打靶

        // 的成绩大于10环乘以剩下要打的次数,也就是说即便后面的都打10环

        // 也无法打够次数,则退出递归

        if (score < 0 || score > (num + 1) * 10) // 次数num为0~9

        {

            return;

        }

        // 如果满足条件且达到最后一层

        if (num == 0)

        {

            store2[num] = score;

            Output(store2);

            return;

        }

        for (int i = 0; i <= 10; ++i)

        {

            store2[num] = i;

            Cumput(score - i, num - 1, store2);

        }

        // Console.Write(" {0}",store2[5]);

    }

    public static void main(String[] args) {
       
        int[] store;

        store = new int[10];

        int sum = 0;

        // int a=90;

        // int b=9;

        // Output();

        daba2.Cumput(90, 9, store);

        sum = daba2.sum2();

        // M.Cumput2(a,b,store);

        // Console.Write(" {0}",store[3]);

        // cout<<"总数:"<<sum<<endl;

        System.out.println(sum);

    }

}