void main()
{
  long lCount = 0;  // 所有打中90环的情况
  Shoot(1, 0, ref lCount);
  Console.WriteLine(lCount.ToString());
}        // 第n次打靶情况
        // @param n 第n次打靶
        // @param lastMarks 上次打靶成绩
        // @param[out] nCount 打中90环的次数
        private void Shoot(int n, int lastMarks, ref long lCount)
        {
            if (10 == n)
            {
                for (int i = 0; i <= 10; i++)
                {
                    if (90 == lastMarks + i)
                    {
                        lCount += 1;
                    }
                }
            }
            else
            {
                for (int i = 0; i <= 10; i++)
                {
                    if (90 > lastMarks + i + (10-n)*10)
                    {
                        // 已经不能达到90环
                           continue;
                    }
                    else
                    {
                        Shoot(n + 1, lastMarks + i,ref lCount);
                    }
                }
            }
        }

解决方案 »

  1.   


    using System ;  
    public class M{    //public static int[] store;
        //相当于设置了全局变量    //这个全局变量sum是包含在M类中的
        public static int sum;    public M()    {
            int sum =0;
            // int[] store = {1,2,3,4,5,6,7,8,9,0}; 
        }    //打印函数    //符合要求的则把它打印出来    public static void Output(int[] store2)    {
            for(int i = 9; i>=0; --i)        {
                Console.Write("   {0}",store2[i]);
            }        Console.WriteLine();
            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 class myApp{
        public static void Main( )     {
            int[] store;        store = new int[10];         int sum = 0;        //int a=90;        //int b=9;        //Output();        M.Cumput(90,9,store);
            sum = M.sum2();
            
            //M.Cumput2(a,b,store);        //Console.Write("   {0}",store[3]);        //cout<<"总数:"<<sum<<endl;        Console.Write(" 总数:   {0}",sum);
        }}   程序结果一共有92 378种可能。
      

  2.   

    using System;namespace Shot
    { class ShotClass
    {
    static int resoultNum = 0; [STAThread]
    static void Main(string[] args)
    {
    DoShot(1, 0);
    Console.WriteLine("{0}", resoultNum.ToString());
    Console.ReadLine();
    } static void DoShot(int index, int sum)
    {
    if (index == 11)
    return; if ((index == 3) && (sum < 10))
    return;
    if ((index == 4) && (sum < 20))
    return;
    if ((index == 5) && (sum < 30))
    return;
    if ((index == 6) && (sum < 40))
    return;
    if ((index == 7) && (sum < 50))
    return;
    if ((index == 8) && (sum < 60))
    return;
    if ((index == 9) && (sum < 70))
    return;
    if ((index == 10) && (sum < 80))
    return; int resoult = 0; for (int i = 0; i <= 10; i++)
    {
    resoult = sum;
    resoult += i;

    if (resoult == 90)
    {
    resoultNum++;
    return;
    }
    else
    {
    DoShot(index + 1, resoult);
    }
    } }
    }
    }
      

  3.   

    更简洁点是using System;namespace Shot
    { class ShotClass
    {
    static int resoultNum = 0; [STAThread]
    static void Main(string[] args)
    {
    DoShot(1, 0);
    Console.WriteLine("{0}", resoultNum.ToString());
    Console.ReadLine();
    } static void DoShot(int index, int sum)
    {
    if (index == 11)
    return; if( sum < (index - 2) * 10)
    return; int resoult = 0; for (int i = 0; i <= 10; i++)
    {
    resoult = sum;
    resoult += i;

    if (resoult == 90)
    {
    resoultNum++;
    return;
    }
    else
    {
    DoShot(index + 1, resoult);
    }
    } }
    }
    }
      

  4.   

    milozy1983 写的我咋没看懂?第一次出现90的时候,应该退出for循环了.此时DoShot(index + 1, resoult)里,index=10,resoult=90,我跟踪下去,index和resoult每return一次就减1和10,没弄懂?............