vocus logo

方格子 vocus

Fibonacci 費氏數列

更新 發佈閱讀 4 分鐘

在本篇文章中,我們將探討如何透過遞迴(Recursion)來實作 Fibonacci 數列。

Fibonacci 數列簡介

Fibonacci 數列是一個相當著名的數學序列,其定義如下:

  • F(0) = 0
  • F(1) = 1
  • 當 n ≥ 2 時,F(n) = F(n-1) + F(n-2)

也就是說,Fibonacci 數列的每一項值(從第三項開始)都是前兩項的總和。Fibonacci 數列的前幾項為:

n    :  0   1   2   3   4   5   6   7   8   9  ...
F(n) : 0 1 1 2 3 5 8 13 21 34 ...

程式碼

以下為完整的 C 程式碼範例:

// 遞迴產生 Fibonacci 數列的函式
#include <stdio.h>

// 宣告 fibonacci 函式原型,返回型別為 unsigned long long int
unsigned long long int fibonacci(unsigned int n);

// main 函式,開始程式執行
int main(void)
{
unsigned long long int result; // 用來儲存 Fibonacci 值
unsigned int number; // 用戶輸入的數字

// 提示用戶輸入整數
printf("%s", "Enter an integer: ");
scanf("%u", &number);

// 計算用戶輸入數字對應的 Fibonacci 值
result = fibonacci(number);

// 顯示結果
printf("Fibonacci(%u) = %llu\n", number, result);
} // end main

// Fibonacci 函式的遞迴定義
unsigned long long int fibonacci(unsigned int n)
{
// 基本情況:當 n 等於 0 或 1 時,直接回傳 n
if (0 == n || 1 == n)
{
return n;
}
// 遞迴情況:計算前兩項的和
else
{
return fibonacci(n - 1) + fibonacci(n - 2);
}
} // end function fibonacci
  • n 為 0 或 1 時,直接回傳 n
  • 這就是遞迴的終止條件:不需要再進行任何遞迴呼叫。

  • n > 1 時,將回傳 fibonacci(n-1)fibonacci(n-2) 的和。
  • 遞迴的運作方式:
    • 為了計算 fibonacci(n),必須先計算 fibonacci(n-1)fibonacci(n-2)
    • 計算 fibonacci(n-1) 時,又會進一步呼叫 fibonacci(n-2)fibonacci(n-3),如此層層展開。
    • 最終都會回到基礎情況 n == 0n == 1,才依序回傳並累加。

以輸入 n = 5 為例,fibonacci(5) 會依照下列遞迴程序執行:

  1. fibonacci(5)
    • → 需要 fibonacci(4) + fibonacci(3)
  2. fibonacci(4)
    • → 需要 fibonacci(3) + fibonacci(2)
  3. fibonacci(3)(在 fibonacci(4) 內部呼叫)
    • → 需要 fibonacci(2) + fibonacci(1)
  4. fibonacci(2)(在 fibonacci(3) 內部呼叫)
    • → 需要 fibonacci(1) + fibonacci(0)
    • fibonacci(1) 回傳 1
    • fibonacci(0) 回傳 0
    • 因此 fibonacci(2) 回傳 1 + 0 = 1
  5. 回到 fibonacci(3)
    • 另一個呼叫為 fibonacci(1),直接回傳 1
    • 因此 fibonacci(3) 回傳 1 + 1 = 2
  6. 回到 fibonacci(4)
    • 已經知道 fibonacci(3) = 2
    • 另一個呼叫 fibonacci(2) 在之前已算出來是 1
    • 因此 fibonacci(4) 回傳 2 + 1 = 3
  7. 回到最外層 fibonacci(5)
    • 已經知道 fibonacci(4) = 3
    • 需要再計算 fibonacci(3) = 2 (一樣進行遞迴)
    • 最後 fibonacci(5) = 3 + 2 = 5

經過以上遞迴展開,我們得到 Fibonacci(5) = 5

留言
avatar-img
電資鼠 - 您的學習好夥伴
25會員
242內容數
在當今數位時代,電資領域人才需求爆發式成長,不論是前端網頁設計、嵌入式開發、人工智慧、物聯網還是軟硬體整合,這些技術都在改變世界。而掌握 C/C++、Python、數位邏輯、電路學與嵌入式開發等大學電資領域的課程,正是進入這個高薪、高需求產業的關鍵!
2025/03/07
本章節將探討左下三角稀疏矩陣。
Thumbnail
2025/03/07
本章節將探討左下三角稀疏矩陣。
Thumbnail
2025/03/07
相信讀者現在對於鏈結串列有了更多的認識,所以我再進一步,示範更多關於鏈結串列的操作,這部分示範會將程式模組化。將鏈結串列的操作寫進一個標頭檔,並在主程式中引入。
Thumbnail
2025/03/07
相信讀者現在對於鏈結串列有了更多的認識,所以我再進一步,示範更多關於鏈結串列的操作,這部分示範會將程式模組化。將鏈結串列的操作寫進一個標頭檔,並在主程式中引入。
Thumbnail
2025/03/07
本章節示範透過「陣列索引」和「指標運算」兩種方式來存取同一個二維陣列 a,並印出相同的數值以及對應的位址,以說明它們其實指向的是同一塊連續的記憶體空間。本文將依序解釋各段程式碼,並示範可能的執行結果與背後原理。
Thumbnail
2025/03/07
本章節示範透過「陣列索引」和「指標運算」兩種方式來存取同一個二維陣列 a,並印出相同的數值以及對應的位址,以說明它們其實指向的是同一塊連續的記憶體空間。本文將依序解釋各段程式碼,並示範可能的執行結果與背後原理。
Thumbnail
看更多
你可能也想看
Thumbnail
高中數學主題練習—二階行列式
Thumbnail
高中數學主題練習—二階行列式
Thumbnail
5 月,方格創作島正式開島。這是一趟 28 天的創作旅程。活動期間,每週都會有新的任務地圖與陪跑計畫,從最簡單的帳號使用、沙龍建立,到帶著你從一句話、一張照片開始,一步一步找到屬於自己的創作節奏。不需要長篇大論,不需要完美的文筆,只需要帶上你今天的日常,就可以出發。征服創作島,抱回靈感與大獎!
Thumbnail
5 月,方格創作島正式開島。這是一趟 28 天的創作旅程。活動期間,每週都會有新的任務地圖與陪跑計畫,從最簡單的帳號使用、沙龍建立,到帶著你從一句話、一張照片開始,一步一步找到屬於自己的創作節奏。不需要長篇大論,不需要完美的文筆,只需要帶上你今天的日常,就可以出發。征服創作島,抱回靈感與大獎!
Thumbnail
高中數學主題練習—對數方程式
Thumbnail
高中數學主題練習—對數方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
見諸參與鄧伯宸口述,鄧湘庭於〈那個大霧的時代〉記述父親回憶,鄧伯宸因故遭受牽連,而案件核心的三人,在鄧伯宸記憶裡:「成立了成大共產黨,他們製作了五星徽章,印刷共產黨宣言——刻鋼板的——他們收集中共空飄的傳單,以及中國共產黨中央委員會有關文化大革命決議文的英文打字稿,另外還有手槍子彈十發。」
Thumbnail
見諸參與鄧伯宸口述,鄧湘庭於〈那個大霧的時代〉記述父親回憶,鄧伯宸因故遭受牽連,而案件核心的三人,在鄧伯宸記憶裡:「成立了成大共產黨,他們製作了五星徽章,印刷共產黨宣言——刻鋼板的——他們收集中共空飄的傳單,以及中國共產黨中央委員會有關文化大革命決議文的英文打字稿,另外還有手槍子彈十發。」
Thumbnail
當代名導基里爾.賽勒布倫尼科夫身兼電影、劇場與歌劇導演,其作品流動著強烈的反叛與詩意。在俄烏戰爭爆發後,他持續以創作回應專制體制的壓迫。《傳奇:帕拉贊諾夫的十段殘篇》致敬蘇聯電影大師帕拉贊諾夫。本文作者透過媒介本質的分析,解構賽勒布倫尼科夫如何利用影劇雙棲的特質,在荒謬世道中尋找藝術的「生存之道」。
Thumbnail
當代名導基里爾.賽勒布倫尼科夫身兼電影、劇場與歌劇導演,其作品流動著強烈的反叛與詩意。在俄烏戰爭爆發後,他持續以創作回應專制體制的壓迫。《傳奇:帕拉贊諾夫的十段殘篇》致敬蘇聯電影大師帕拉贊諾夫。本文作者透過媒介本質的分析,解構賽勒布倫尼科夫如何利用影劇雙棲的特質,在荒謬世道中尋找藝術的「生存之道」。
Thumbnail
高中數學主題練習—二階行列式
Thumbnail
高中數學主題練習—二階行列式
Thumbnail
當時間變少之後,看戲反而變得更加重要——這是在成為母親之後,我第一次誠實地面對這一件事:我沒有那麼多的晚上,可以任性地留給自己了。看戲不再只是「今天有沒有空」,而是牽動整個週末的結構,誰應該照顧孩子,我該在什麼時間回到家,隔天還有沒有精神帶小孩⋯⋯於是,我不得不學會一件以前並不擅長的事:挑選。
Thumbnail
當時間變少之後,看戲反而變得更加重要——這是在成為母親之後,我第一次誠實地面對這一件事:我沒有那麼多的晚上,可以任性地留給自己了。看戲不再只是「今天有沒有空」,而是牽動整個週末的結構,誰應該照顧孩子,我該在什麼時間回到家,隔天還有沒有精神帶小孩⋯⋯於是,我不得不學會一件以前並不擅長的事:挑選。
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News