騰訊2016年校招實習筆試題

猴子摘香蕉,它可以一次摘1個,或者一次摘兩個,總共摘了50個香蕉,請問共有多少中摘法?(騰訊2016年校招實習筆試題簡答題的第二題。)

解答過程如下:
由於猴子一次只能摘1個或者兩個,設猴子有m次摘了2個香蕉的情況,那麼可以知(50-2m)次摘了一個香蕉的情況,其中 0 m 25

經分析,
當m=0時,共有C050+0 = C050 種情況。
當m=1時,共有C148+1 = C149 種情況。
當m=2時,共有C246+2 = C248 種情況。
當m=3時,共有C344+3 = C347 種情況。
……
當m=24時,共有C242+24 = C2426 種情況。
當m=25時,共有C250+25 = C2525 種情況。

SUM = C050 +C149 +C248 +…+C2426 +C2525

解法二:
設摘n個香蕉有f(n)中摘法,如f(50)表示50個香蕉的摘法,經分析,f(n)=f(n-1)+f(n-2)。(n 3),且f(2)=2,f(1)=1.可用c++編程實現。

代碼一:

#include<iostream>
using namespace std;
long long f(int n)
{
    if(n<0)
        return -1;
    else if(n==1)
        return 1;
    else if(n==2)
        return 2;
    return f(n-1)+f(n-2);
}

void main()
{
    cout<<f(50);
}

代碼一由於採用遞歸的辦法進行計算,速度太慢(我i5的筆記本跑了5五分鐘沒跑出來)。出於效率考慮,現改進爲代碼二,採用非遞歸方法計算。

代碼二:

#include<iostream>
using namespace std;
long long f(int n)
{
    long long a=1,b=2,c=0;
    if(n<1)
        return 0;
    else if(n==1)
        return 1;
    else if(n==2)
        return 2;
    else
    {
        for(int i=3;i<=n;i++)
        {
            c=a+b;
            a=b;
            b=c;    
        }
        return c;
    }
}

void main()
{
    cout<<"f(1)="<<f(1)<<endl;
    cout<<"f(2)="<<f(2)<<endl;
    for(int i=3;i<=50;i++)
    {
        cout<<"f("<<i<<")=f("<<i-1<<")+f("<<i-2<<")="<<f(i)<<endl;
    }
    getchar();
}

代碼二計算可以得到,f(50)=20365011074。

發佈了23 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章