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

在當今數位時代,電資領域人才需求爆發式成長,不論是前端網頁設計、嵌入式開發、人工智慧、物聯網還是軟硬體整合,這些技術都在改變世界。而掌握 C/C++、Python、數位邏輯、電路學與嵌入式開發等大學電資領域的課程,正是進入這個高薪、高需求產業的關鍵!
留言
avatar-img
留言分享你的想法!

































































本章節將帶領讀者觀看更多輸出圖形的考題: 輸出城牆、X型,教會你如何分析圖形,然後實際打出程式碼,這將能夠提升讀者的邏輯思維能力與程式設計能力。
圖形題也是考驗你掌握迴圈的好考題,以下幾題供你參考: 本章節將介紹許多關於迴圈圖形的考題,現今某些大學的考題、考碩士的考題都曾出現過,而透過本章的學習,將能夠幫助讀者對於迴圈的使用更為理解。
本章節將提供各迴圈實作九九乘法表的邏輯。最後以條件運算子再次改寫,形成更簡潔的程式架構。
本章將介紹 C 語言的鏈結串列 (Linked List),這是一種 動態數據結構,也是較進階的單元。透過本章學習,你將能夠 靈活操作 C 語言的鏈結串列,並為進一步學習 進階數據結構做好準備。
本章將深入解析 C 語言的檔案處理 ,學習如何使用 標準 I/O 函式 (fopen(), fclose(), fgets(), fprintf()等) 來讀取與寫入檔案。檔案處理是 儲存與管理數據 的核心技術,適用於日誌記錄等應用。 透過本章學習,你將能夠 熟練操作 C 語言的檔案處理
C Preprocessor 負責在編譯之前對原始程式碼進行處理。其所執行的一些動作包刮了: 將其它檔案含入編譯的檔案中、定義符號常數和巨集、程式碼的條件式編譯、以及條件式執行的前置處理器命令。所有前置處理器命令都會以# 開始。本章會讓你對前置處理器有一些初步的認識與了解。
本章節將帶領讀者觀看更多輸出圖形的考題: 輸出城牆、X型,教會你如何分析圖形,然後實際打出程式碼,這將能夠提升讀者的邏輯思維能力與程式設計能力。
圖形題也是考驗你掌握迴圈的好考題,以下幾題供你參考: 本章節將介紹許多關於迴圈圖形的考題,現今某些大學的考題、考碩士的考題都曾出現過,而透過本章的學習,將能夠幫助讀者對於迴圈的使用更為理解。
本章節將提供各迴圈實作九九乘法表的邏輯。最後以條件運算子再次改寫,形成更簡潔的程式架構。
本章將介紹 C 語言的鏈結串列 (Linked List),這是一種 動態數據結構,也是較進階的單元。透過本章學習,你將能夠 靈活操作 C 語言的鏈結串列,並為進一步學習 進階數據結構做好準備。
本章將深入解析 C 語言的檔案處理 ,學習如何使用 標準 I/O 函式 (fopen(), fclose(), fgets(), fprintf()等) 來讀取與寫入檔案。檔案處理是 儲存與管理數據 的核心技術,適用於日誌記錄等應用。 透過本章學習,你將能夠 熟練操作 C 語言的檔案處理
C Preprocessor 負責在編譯之前對原始程式碼進行處理。其所執行的一些動作包刮了: 將其它檔案含入編譯的檔案中、定義符號常數和巨集、程式碼的條件式編譯、以及條件式執行的前置處理器命令。所有前置處理器命令都會以# 開始。本章會讓你對前置處理器有一些初步的認識與了解。
你可能也想看
Google News 追蹤
“好熟悉的數列,讓阿離想想!哦對了!正好構成費波那契數列!這麼巧合?不過這事發的時間倒不符合這個數列?”阿離左手托腮思索著。 這時,畫面上出現了一排數字0,1,1,2,3,5,8,13,21,34,55,89,144,233…… 在數位5下出現了6減1,數字8下出現了14減6,數字13被標成了紅
“好熟悉的數列,讓阿離想想!哦對了!正好構成費波那契數列!這麼巧合?不過這事發的時間倒不符合這個數列?”阿離左手托腮思索著。 這時,畫面上出現了一排數字0,1,1,2,3,5,8,13,21,34,55,89,144,233…… 在數位5下出現了6減1,數字8下出現了14減6,數字13被標成了紅