1. <tt id="5hhch"><source id="5hhch"></source></tt>
    1. <xmp id="5hhch"></xmp>

  2. <xmp id="5hhch"><rt id="5hhch"></rt></xmp>

    <rp id="5hhch"></rp>
        <dfn id="5hhch"></dfn>

      1. 程序員打靶問題及解析

        時間:2020-11-07 17:41:55 面試問題 我要投稿

        程序員打靶問題及解析

        面試例題 1:一個射擊運動員打靶,靶一共有 10 環,連開 10 槍打中 90 環的可能性有多少種?請用遞歸算法編程實現。[中國某著名通信企業 H面試題]
        解析:靶上一共有 10 種可能——1 環到 10 環,還有可能脫靶,那就是 0 環,加在一起共 11 種可能。這是一道考循環和遞歸的面試題。我們在這個程序中將利用遞歸的辦法實現打靶所有可能的演示,并計算出結果。讀者會問,難道一定要使用遞歸?當然不是。我們也可以連續用 10個循環語句來表示程序,代碼如下:
        for (i1=0;i1<=10;i1++)
        {
        for (i2=0;i2<=10;i2++)
        {
        for (i3=0;i3<=10;i3++)
        {
        ......
        for (i10=0;i10<=10;i10++)
        {
        if(i1+i2+i3+...+i10=90)
        Print();
        }
        ......
        }
        }
        }
        但是,上面的循環程序雖然解決了問題,但時間復雜度和空間復雜度無疑是很高的。比較好的辦法當然是采用遞歸的方式,事實上公司也就是這么設計的。遞歸的條件由以下 4 步完成:
        (1)如果出現這種情況,即便后面每槍都打 10 環也無法打夠總環數 90,在這種情況下就不用再打了,則退出遞歸。代碼如下:
        if(score < 0 || score > (num+1)*10 ) //次數num 為0~9
        {
        return;
        }
        (2)如果滿足條件且打到最后一次(因為必須打 10 次),代碼如下:
        if(num == 0)
        {
        store2[num] = score;
        Output( store2);
        return;
        }
        (3)如果沒有出現以上兩種情況則執行遞歸,代碼如下:
        for(int i = 0; i <= 10; ++i)
        {
        //這里實際上為了方便把順序倒了過來,store2[9]是第1 回
        //store2[8]是第 2 回⋯⋯store2[0]是第 10 回
        store2[num] = i;
        Cumput(score - i, num - 1,store2);
        }
        (4)打印函數,符合要求的.則把它打印出來。代碼如下:
        public static void Output(int[] store2)
        {
        for(int i = 9; i>=0; --i)
        {
        Console.Write(" {0}",store2[i]);
        }
        Console.WriteLine();
        sum++;
        }
        答案:
        用 C#編寫的完整代碼如下:
        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 種可能。
        也可以用 C++編寫,代碼如下:
        #include <iostream>
        using namespace std;
        int sum;
        int store[10];
        void Output()
        {
        for(int i = 9; i>=0; --i)
        {
        cout<<store[i]<<" ";
        }
        cout<<endl;
        ++sum;
        }
        void Cumput(int score, int num)
        {
        if(score < 0 || score > (num+1)*10 ) //次數num 為0~9
        return;
        if(num == 0)
        {
        store[num] = score;
        Output();
        return;
        }
        for(int i = 0; i <= 10; ++i)
        {
        store[num] = i;
        Cumput(score - i, num - 1);
        }
        }
        int main(int argc, char* argv[])
        {
        Cumput(90, 9);
        cout<<"總數:"<<sum<<endl;
        return 0;
        }

        【程序員打靶問題及解析】相關文章:

        程序員面試問題及答案10-08

        意大利留學常見問題及解析08-17

        職場新人常見問題及解析10-20

        面試常見問題及回答技巧解析12-15

        新加坡留學反簽證相關問題及解析10-18

        俄羅斯留學的問題及詳細解析07-11

        留學荷蘭的常見簽證問題及解析06-20

        常見的面試問題及答案解析11-06

        MBA提前批面試高頻問題及思路解析09-04

        英語面試問題大解析及情景對話09-13

        国产高潮无套免费视频_久久九九兔免费精品6_99精品热6080YY久久_国产91久久久久久无码

        1. <tt id="5hhch"><source id="5hhch"></source></tt>
          1. <xmp id="5hhch"></xmp>

        2. <xmp id="5hhch"><rt id="5hhch"></rt></xmp>

          <rp id="5hhch"></rp>
              <dfn id="5hhch"></dfn>