斐波那契額數(shù)列 問題
創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站制作、成都做網(wǎng)站、麻山網(wǎng)絡(luò)推廣、成都小程序開發(fā)、麻山網(wǎng)絡(luò)營銷、麻山企業(yè)策劃、麻山品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供麻山建站搭建服務(wù),24小時服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com
#include?stdio.h
int?fib(int?n)
{
if(n==1||n==2)
{
return?1;
}
return?fib(n-1)+fib(n-2);
}
int?main(void)?
{
printf("%d\n",fib(3));
return?0;
}
//兔子的對數(shù),就是Fibonacci數(shù)列
//1 1 2 3 5 8 13 21 34 55 89 ...
#include?stdio.h
int?f(int?n)
{
if(n??3)
return?1;
else
return?f(n?-?2)?+?f(n?-?1);
}
void?main()
{
int?n;
scanf("%d",?n);
printf("%d年后,有兔子%d只.\n",?n,?f(n));
}
可以考慮遞歸算法:
int Amount(int day)
{
if (day==10)
{
return 1;
}
else
{
return 2*(Amount(day-1)+1);
}
}
早說嘛。。。害的白寫了個。。
這題可以多用幾個遞歸函數(shù)解決,在這里我稱不能生育的兔子為小兔,能生育的為大兔
int littleR(int month)
{
if (month==1)
return 0;
else
return bigR(month-1)+little(month-1);
}
int bigR(int month)
{
if (month==1)
{
return 1;
}
else if (month==2)
{
return 1;
}
else if (month==3)
{
return 1;
}
else
{
return bigR(month-1)+little(month-2);
}
}
int totalR(int month)
{
return littleR(month)+bigR(month);
}
注:這種增長速度的話很快兔子的數(shù)量就會增長到很大,所以如果month達到幾十的話就會超過int范圍,所以可以考慮用__int64代替int,另外到時候如果依然每次都遞歸的話運行速度也會變慢,可能要好幾秒,好幾分鐘,甚至更長的時間才能算出結(jié)果,所以可以考慮用數(shù)組存每個遞歸函數(shù)算出的值,如:
littleR(int month)中else可寫成
if (...)
{
...
}
else
{
if (a[month]!=0)
return month;
else
return a[month]=bigR(month-1)+little(month-1);
}
用這種方法可以適當(dāng)提高運行速度。。。
思路不要亂。這個月的兔子只有兩個來源,一個來源是上個月的老兔子,另一個來源是這個月剛出生的兔子,而這個月剛出生的兔子,就是兩個月前的所有兔子,因為兩個月前的所有兔子,無論兩個月前就是老的,還是兩個月前剛生的,到了這個月就全部具有生育能力,每只都可以下一對兒,所以可以得到一個遞推關(guān)系f(n) = f(n - 1) + f(n - 2)。那么程序自然是
long?fun(int?month)
{
if(month?==?1?||?month?==?2)
return?1;
else
return?fun(month?-?1)?+?fun(month?-2);
}
//?ConsoleApplication1.cpp?:?定義控制臺應(yīng)用程序的入口點。
int?main()
{?
int?Mon;
long?Num;
scanf("%d",Mon);
Num?=?fun(Mon);
printf("第%d月共有兔子%ld只\n",Mon,Num);?
return?0;?
}
至于你的程序,很難把它改正確,因為這題壓根不是那個思路,那樣想會越想越亂的
遞歸主要元素:入口,遞歸和結(jié)束。在定義遞歸函數(shù)時將這三個元素考慮進去就行;如: double callnext(int n)
{
if(n1) return callnext(n-1)+3;
else return 1;
}
int main()
{
int m;
scanf("%d",m);
printf("result=%f",callnext(m));
return 0;
}
入口:callnext(m);遞歸:if(n1) return callnext(n-1)+3中的callnext(n-1);結(jié)束:else return 1;整個執(zhí)行流程:callnext(m) 調(diào)用 callnext(m-1);callnext(m-1)調(diào)用callnext(m-1-1)。。。
callnext(2)調(diào)用callnext(1);callnext(1)=1;結(jié)束;