阿摩線上測驗 登入

申論題資訊

試卷:96年 - 096年高等三級暨普通資訊處理(普考)#32451
科目:程式設計
年份:96年
排序:0

申論題內容

四、若把某數列的 i 個值紀錄為 f(i),已知 f(1)=1 , f(2)=2 , f(3)=3 , f(4)=5;且若 i>4 則 f(i) = 3 * f(i-1) + 5 * f(i-3)。撰寫一函式(function):int fun(int n)。若輸入之 n 為正 整數,則輸出 f(n)。並用 Big-O 符號分析執行該程式的時間及空間複雜度。(30 分)

詳解 (共 1 筆)

詳解 提供者:hchungw
要實現這個函式,我們可以使用遞歸,但這會導致很多重複計算。為了提高效率,我們可以使用動態規劃(Dynamic Programming, DP)的方法來儲存先前計算的結果,從而避免重複計算。這樣做可以將時間複雜度降到O(n)。
以下是根據給定規則實現fun函式的代碼,這個函式計算給定的數列f(n)的值:
c
Copy code
#include <stdio.h>
int fun(int n) {
    if (n == 1) return 1;
    if (n == 2) return 2;
    if (n == 3) return 3;
    if (n == 4) return 5;
    
    int dp[n + 1];
    dp[1] = 1;
    dp[2] = 2;
    dp[3] = 3;
    dp[4] = 5;
    for (int i = 5; i <= n; i++) {
        dp[i] = 3 * dp[i - 1] + 5 * dp[i - 3];
    }
    return dp[n];
}
int main() {
    int n;
    printf("Enter a positive integer n: ");
    scanf("%d", &n);
    
    printf("f(%d) = %d\n", n, fun(n));
    return 0;
}
這段代碼首先處理基本情況(即f(1)到f(4)的值),然後對於n > 4的情況,使用一個陣列dp來記錄每個f(i)的值,從i = 5開始迭代計算直到n。每一步計算都利用了先前計算的結果,從而避免了重複計算。
Big-O 分析
時間複雜度:由於我們對於從5到n的每個數字僅執行了一次計算,因此時間複雜度是O(n)。
空間複雜度:我們使用了一個額外的陣列dp來儲存從f(1)到f(n)的計算結果,因此空間複雜度也是O(n)。
總結來說,這個動態規劃方法使得我們在計算f(n)時,時間和空間複雜度都是線性的。