阿摩線上測驗 登入

申論題資訊

試卷:110年 - 110 經濟部所屬事業機構_新進職員甄試_資訊:1.資訊管理 2.程式設計#103708
科目:國營事業◆1.資訊管理 2.程式設計
年份:110年
排序:0

題組內容

四、下列問題,請用遞迴(Recursive)的方式來撰寫:(共2題,共15分)

申論題內容

(一)實驗室培養某細胞,此細胞區分為成年與幼年細胞。每個成年細胞於1個月後會生出 2個幼年細胞,幼年細胞於1個月後會變為成年細胞。請用遞迴方式撰寫一函式 CellNumber,輸入為N個月後,其傳回為N個月後 細胞的總數。(8分)

詳解 (共 4 筆)

詳解 提供者:高普考小白

思考邏輯:

x:成年細胞 y:幼年細胞

f(0) = x                                     = 1

過一個月後↓↓上個月的成年細胞的迸出兩個幼年細胞,上個月的幼年細胞變成成年細胞

f(1) = x + 2y                                = 3

過一個月後↓↓上個月的成年細胞的迸出兩個幼年細胞,上個月的幼年細胞變成成年細胞

f(2) = x + 2y + 2x   = 3x + 2y               = 5

過一個月後↓↓上個月的成年細胞的迸出兩個幼年細胞,上個月的幼年細胞變成成年細胞

f(3) = 3x + 6y + 2x  = 5x + 6y               = 11

過一個月後↓↓上個月的成年細胞的迸出兩個幼年細胞,上個月的幼年細胞變成成年細胞

f(4) = 5x + 10y + 6x = 11x + 10y             = 21

… 以此類推

public static int CellNumber(int n_month){

    if(n_month==0)

         return 1;

    else if(n_month==1);

        return 3;

    else

         return CellNumber(n_month-1) +  2*CellNumber(n_month-2);

       //      上月的沒迸,只是變成年 +       前月的有迸兩個幼年

}

詳解 提供者:Grace

int CellNumber(int months, int adult, pre_baby){
    int baby = adult*2; 
    int adult = pre_baby; //前個月baby長大
    int sum = adult + baby; //當月成長
    if (month == 1){
        return sum;
    }
    CellsNumber(months-1, adult, baby)
}

詳解 提供者:polar33794

int CellNumber(int mon,int Cn_1,int An_1)
{
    int Cn=0; //第N個月的幼體細胞數量
    int An=0;//第N個月的成體細胞數量
    if(mon>0)//當月份mon比0大 ,就要計算n月的幼與成體數量
    {
        Cn=An_1*2; //每一個本(n-1)月的成體數量在下一月(n)生出兩個幼體
        An=Cn_1+An_1;//每一個本(n-1)月的幼體數量在下一月(n)長成1個幼體,再加上本月(n-1)原有的成體數量,就是下一個(n)月的成體數量
        --mon;
        return CellNumber(mon,Cn,An);
    }
    else
       return (fn_1+Fn_1);//如果上一個月就是經過了第mon個月(已經計算完了mon==0),就將上一個月的幼體與成體數量加起來,傳回去
}

詳解 提供者:奈特巴
這樣寫不知道行不行,看起來邏輯是一樣的
如果有錯誤,請各位高手指導
 
可以先以這樣思考 假設都是一個年幼細胞開始,你可以發現經過月份跟細胞總數是這樣
0個月總共1個細胞
1個月總共1個細胞
2個月總共3個細胞
3個月總共5個細胞
4個月總共11個細胞
5個月總共21個細胞
其中找到規律為
單數月總數為上個月總數*2-1 
雙數月總數為上個月總數*2+1

public int CellNumber(int month){
    if(month==0){//經過0個月細胞總數為1
        return 1;
    }else if(month%2==1){//依照題目規則,可推導出細胞數量變化規則如下
        //經過單數個月的成長,細胞總數會是上個月的2倍-1
        return CellNumber(month-1)*2-1;
    }else if(month%2==0){
        //經過雙數個月的成長,細胞總數會是上個月的2倍-1
        return CellNumber(month-1)*2+1;
    }
}