本文檔是格式範本。
請依照以下指引編寫完整的 markdown 文件,並確保所有標題及格式符合要求。
請將標題的 學號
換成全數字的學號。如:
# 41143263
報告內容...
Caution
- 作業使用 GitHub Action 做 CI 檢查。
- 你的作業裡面也要包含
.github/
和底下的所有檔案。 - 作業截止前 GitHub Action 沒通過,請根據規格更新你的作業報告。
- 作業截止後 GitHub Action 沒通過,作業等於沒交。
需撰寫解題思路與分析。
- 問題描述:清楚陳述題目背景與要求。
- 解題策略:提供您的規劃步驟,例如使用演算法或資料結構。
範例:
## 解題說明
本題要求實現一個遞迴函式,計算從 $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 分析),並以條列式說明:
- 時間複雜度。
- 空間複雜度。
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)$。
- 測試案例設計。
- 執行結果。
- 驗證結果。
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 問題。