close

前言

以下的一些內容大部份是跟大爺的不歸路有關,對沒有興趣的鄉親來說可能會有點無聊,有點悶。

如果有高手不小心路過此地,還望多多指教,如果內容有誤,還麻煩指點一下大爺!感恩!


以下內容出自於這裡:費氏數列及黃金分割

有興趣的鄉親可以上去參考看看哦^^"

 

十三世紀的義大利數學家費伯納西 (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

 

大爺說:

接下來就這隻程式大爺來做一下自我的分析,其實這隻程式已經是第三版了,也代表這麼小小的一隻程式大爺改了三次。

第一隻程式是大爺先把每個月會增加兔子的數量給畫出來之後,才從它們之間的關聯性用「邏輯思考」將數學公式轉換成程式語言,而這一部份就是程式最重要、也最困難的部份。

因為在這個轉換的過程之中會很容昜發生「邏輯上的思考錯誤」和「數學運算錯誤」,而這兩種錯誤都會讓「整個程式的結果是錯的!」所以寫完一隻程式之後要不斷、反覆的去測試和思考,才能得到正確的結果。

而第二隻程式大爺則是在迷迷糊糊、半睡半醒之中完成,所以程式整體上亂七八糟,連大爺也不知道在寫些什麼鬼!

目前這第三隻程式大爺就覺得比較有邏輯。一隻程式要不容昜出錯,最重要的是設計師本身要很清楚了解,程式的運作流程在講什麼鬼,每個變數儲存的資料為何,有沒有濫用變數、變數會在什麼情形之下超出範圍,這些都要思考清楚,否則很容昜出問題的。

再來就是程式的「時間複雜度」,一隻程式有沒有「效率」就要看它了,這邊大爺就不詳細說明。相信知道這東西的朋友都已經很了解,而不知道的朋友有興趣自已去翻書來看吧 ^^

 

好了,看了以上的程式之後,如果有鄉親發現這個程式有任何的地方是錯的,還望鄉親告訴大爺,感恩哩 ^^!

arrow
arrow
    全站熱搜

    大爺 發表在 痞客邦 留言(0) 人氣()