一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能性有多少种?(递归算法)

package first;

import java.util.Stack;

public class first {

	static int time=10;
	/**
	 * 一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能性有多少种?
	 * 请用递归算法编程实现。[中国某著名通信企业H面试题]
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
//		连续开枪的次数
//		打枪的的总环数环数
		int Boomcount = 0;
		Stack li=new Stack();
		Hitprobability(li,time,Boomcount);
	}

	private static void Hitprobability(Stack li, int time,int boomcount) {
		// TODO Auto-generated method stub
		if(time>0)
		{
			for(int i=0;i<11;i++)
			{
				if(10*(11-time)-boomcount-i<=10)
				{
					li.push(i);
					Hitprobability(li, time-1, boomcount+i);
					li.pop();
				}
			}
		}else if(time==0)
		{
			if(boomcount==90)
			{
				for(int i:li)
				{
					System.out.print(i+"--");
				}
				System.out.println("");
			}
		}
	}
}

======================= 以上是我的程序==============以下是另外两个方法=====
 
  

======================= 第一种====================================


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<<"总数:"<




你可能感兴趣的:(java算法)