學號

本文檔是格式範本。

請依照以下指引編寫完整的 markdown 文件,並確保所有標題及格式符合要求。

請將標題的 學號 換成全數字的學號。如:

# 41143263

報告內容...

Caution

  1. 作業使用 GitHub Action 做 CI 檢查。
  2. 你的作業裡面也要包含 .github/ 和底下的所有檔案。
  3. 作業截止前 GitHub Action 沒通過,請根據規格更新你的作業報告。
  4. 作業截止後 GitHub Action 沒通過,作業等於沒交。

解題說明

需撰寫解題思路與分析。

  1. 問題描述:清楚陳述題目背景與要求。
  2. 解題策略:提供您的規劃步驟,例如使用演算法或資料結構。

範例:

## 解題說明

本題要求實現一個遞迴函式,計算從 $1$ 到 $n$ 的連加總和。

### 解題策略

1. 使用遞迴函式將問題拆解為更小的子問題:
   $$\Sigma(n) = n + \Sigma(n-1)$$
2. 當 $n \leq 1$ 時,返回 $n$ 作為遞迴的結束條件。  
3. 主程式呼叫遞迴函式,並輸出計算結果。

程式實作

Caution

IDE 使用者請把程式碼自行貼在報告裡。

範例:

## 程式實作

以下為主要程式碼:

```cpp
#include <iostream>
using namespace std;

int sigma(int n) {
    if (n < 0)
        throw "n < 0";
    else if (n <= 1)
        return n;
    return n + sigma(n - 1);
}

int main() {
    int result = sigma(3);
    cout << result << '\n';
}
```

效能分析

針對程式碼的效能進行分析(Big-O 分析),並以條列式說明:

  1. 時間複雜度。
  2. 空間複雜度。

Note

  • 通用格式:$O(1)$、$O(\log n)$、$O(n)$、$O(n^2)$、$O(2^n)$。
  • 可以寫通用格式或是寫 $O(100\times \log n + \pi)$ 也可以。
  • $\LaTeX$ 語法範例:$O(\log n)$

範例:

## 效能分析

1. 時間複雜度:程式的時間複雜度為 $O(\log n)$。
2. 空間複雜度:空間複雜度為 $O(100\times \log n + \pi)$。

測試與驗證

  1. 測試案例設計。
  2. 執行結果。
  3. 驗證結果。

Important

非 IDE 使用者「執行結果」需含編譯指令、編譯參數以及輸出,如下列表示:

$ g++ main.c --std=c++21 -o main.exe
$ .\main.exe
hello world!

$ 代表使用者在 shell 中的輸入。

  • 第一個 $ 是編譯指令
  • 第二個 $ 是執行指令
  • 最後沒有 $hello world 代表程式輸出。

只要像這樣寫就能清楚表達,哪個是使用者輸入與程式輸出。

### 測試案例

| 測試案例 | 輸入參數 $n$ | 預期輸出 | 實際輸出 |
|----------|--------------|----------|----------|
| 測試一   | $n = 0$      | 0        | 0        |
| 測試二   | $n = 1$      | 1        | 1        |
| 測試三   | $n = 3$      | 6        | 6        |
| 測試四   | $n = 5$      | 15       | 15       |
| 測試五   | $n = -1$     | 異常拋出 | 異常拋出 |

### 編譯與執行指令

```shell
$ g++ -std=c++17 -o sigma sigma.cpp
$ ./sigma
6
```

### 結論

1. 程式能正確計算 $n$ 到 $1$ 的連加總和。  
2. 在 $n < 0$ 的情況下,程式會成功拋出異常,符合設計預期。  
3. 測試案例涵蓋了多種邊界情況($n = 0$、$n = 1$、$n > 1$、$n < 0$),驗證程式的正確性。

申論及開發報告

使用這個結構、演算法的理念。

範例:

## 申論及開發報告

### 選擇遞迴的原因

在本程式中,使用遞迴來計算連加總和的主要原因如下:

1. **程式邏輯簡單直觀**  
   遞迴的寫法能夠清楚表達「將問題拆解為更小的子問題」的核心概念。  
   例如,計算 $\Sigma(n)$ 的過程可分解為:  

   $$
   \Sigma(n) = n + \Sigma(n-1)
   $$

   當 $n$ 等於 1 或 0 時,直接返回結果,結束遞迴。

2. **易於理解與實現**  
   遞迴的程式碼更接近數學公式的表示方式,特別適合新手學習遞迴的基本概念。  
   以本程式為例:  

   ```cpp
   int sigma(int n) {
       if (n < 0)
           throw "n < 0";
       else if (n <= 1)
           return n;
       return n + sigma(n - 1);
   }
   ```

3. **遞迴的語意清楚**  
   在程式中,每次遞迴呼叫都代表一個「子問題的解」,而最終遞迴的返回結果會逐層相加,完成整體問題的求解。  
   這種設計簡化了邏輯,不需要額外變數來維護中間狀態。

透過遞迴實作 Sigma 計算,程式邏輯簡單且易於理解,特別適合展示遞迴的核心**。然而,遞迴會因堆疊深度受到限制,當 $n$ 值過大時,應考慮使用迭代版本來避免 Stack Overflow 問題。