前言
以下的一些內容大部份是跟大爺的不歸路有關,對沒有興趣的鄉親來說可能會有點無聊,有點悶。
如果有高手不小心路過此地,還望多多指教,如果內容有誤,還麻煩指點一下大爺!感恩!
有興趣的鄉親可以上去參考看看哦^^"
十三世紀的義大利數學家費伯納西 (Fibonacci) 寫 了一本商用的算術和代數手冊《Liber abacci》。在這本書裏,他提出了這麼一個有趣的問題:假定一對兔子在它們出生整整兩個月以後可以生一對小兔子,其後每隔一個月又可以再生一對小兔 子。假定現在在一個籠子裡有一對剛生下來的小兔子,請問一年以後籠子裏應該有幾對兔子?
這是一個很簡單也很有趣的問題,有興趣的鄉親先試著自已解答看看,如果想要解答就請參考上面那個網站吧,有很詳細的說明^^"。
「費氏級數」很常出現在「資料結構與演算法」的相關書籍裡,用來當做「遞迴程式」的講解範例,有興趣的鄉親一起來研究吧^^
不過這是比較偏電腦方面的數學運算啦,如果不是這方面科系的,可能就沒聽過吧 ^^"。
在這邊大爺想用幾種方式解決這個問題,這邊先用C++的「For迴圈」,下次會再放上用「遞迴」的解法。
/*
Program Description
名稱:rabbit_for
版本:0.3版
作者:ckw
日期:2009/08/07
程式目的:
十三世紀的義大利數學家費伯納西 (Fibonacci) 寫了一本商用的算術和代數手冊《Liber abacci》。
在這本書裏,他提出了這麼一個有趣的問題:假定一對兔子在它們出生整整兩個月以後可以生一對小兔子,
其後每隔一個月又可以再生一對小兔子。假定現在在一個籠子裡有一對剛生下來的小兔子,請問一年以後籠子裏應該有幾對兔子?
程式說明:
在第一對兔子未滿2歲之前是無法生下小兔子,所以一開始前2個月免子的數量為1,到第三個月之後,才會開始增加。所以演算法會從第三個月開始計算。
*/
#include <iostream>
using namespace std;
int main()
{
int month = 0; //這個變數是用來記錄使用者輸入的月份;
unsigned long amount =1; //儲存本月份總共的兔子數量;
unsigned long presentRabbits=1; //目前的兔子數量
unsigned long lastMonthOriginalRabbits=1; //上個月份未增加前的數量
int i; //計算迴圈
cout<<"please input the month (you want to know the rabbits amount):";
cin >> month;//讀取使用者輸入的月份
for(i=1; i<=month; i++){
if(i<=2) //判斷是否為月份1或月份2
cout << "Amount of month " << i << " is: " << amount << endl;
else{
amount = presentRabbits + lastMonthOriginalRabbits; //本月份增加的數量=現在的數量+上個月未增加前的數量
lastMonthOriginalRabbits = presentRabbits; //將上個月未增加的數量設為目前兔子的數量
presentRabbits = amount; //將目前兔子的數量設為本月份總數量
cout << "Amount of month " << i << " is: " << amount << endl;
}
}
return 0;
}
以下是執行的過程和結果:
please input the month (you want to know the rabbits amount):12
The amount of rabbit of month 1 is:1
The amount of rabbit of month 2 is:1
The amount of rabbit of month 3 is:2
The amount of rabbit of month 4 is:3
The amount of rabbit of month 5 is:5
The amount of rabbit of month 6 is:8
The amount of rabbit of month 7 is:13
The amount of rabbit of month 8 is:21
The amount of rabbit of month 9 is:34
The amount of rabbit of month 10 is:55
The amount of rabbit of month 11 is:89
The amount of rabbit of month 12 is:144
大爺說:
接下來就這隻程式大爺來做一下自我的分析,其實這隻程式已經是第三版了,也代表這麼小小的一隻程式大爺改了三次。
第一隻程式是大爺先把每個月會增加兔子的數量給畫出來之後,才從它們之間的關聯性用「邏輯思考」將數學公式轉換成程式語言,而這一部份就是程式最重要、也最困難的部份。
因為在這個轉換的過程之中會很容昜發生「邏輯上的思考錯誤」和「數學運算錯誤」,而這兩種錯誤都會讓「整個程式的結果是錯的!」所以寫完一隻程式之後要不斷、反覆的去測試和思考,才能得到正確的結果。
而第二隻程式大爺則是在迷迷糊糊、半睡半醒之中完成,所以程式整體上亂七八糟,連大爺也不知道在寫些什麼鬼!
目前這第三隻程式大爺就覺得比較有邏輯。一隻程式要不容昜出錯,最重要的是設計師本身要很清楚了解,程式的運作流程在講什麼鬼,每個變數儲存的資料為何,有沒有濫用變數、變數會在什麼情形之下超出範圍,這些都要思考清楚,否則很容昜出問題的。
再來就是程式的「時間複雜度」,一隻程式有沒有「效率」就要看它了,這邊大爺就不詳細說明。相信知道這東西的朋友都已經很了解,而不知道的朋友有興趣自已去翻書來看吧 ^^
好了,看了以上的程式之後,如果有鄉親發現這個程式有任何的地方是錯的,還望鄉親告訴大爺,感恩哩 ^^!
留言列表