反向計算數值 已知班上有 10 個同學,考試成績如下: 10 號同學比 9 號同學多出 3 分 9 號同學比 8 號同學多出 12 分 8 號同學比 7 號同學多出 -5 分 7 號同學比 6 號同學多出 7 分 6 號同學比 5 號同學多出 -8 分 5 號同學比 4 號同學多出 1 分 4 號同學比 3 號同學多出 10 分 3 號同學比 2 號同學多出 -4 分 2 號同學比 1 號同學多出 6 分 1 號同學成績為 67 分 請輸出全班學生成績 | |
若遞迴函數 score(n) = 輸出全班成績 則 score(n) 必須先輸出前 n-1 個學生成績,並將第 n-1 位學生的成績,補上差值才是 第 n 位學生成績。 假設每一位學生與前面學生成績的差值放在一個全域變數陣列 t[],則第 n 位學生成績與前面學生成績差值為 t[n-1]。 那麼依題意 t[1]=6; t[2]=-4; t[3]=10; ....可在程式碼中宣告 int t[]={0, 6, -4, 10, 1, -8, 7, -5, 12, 3}; 如此,第 n 號學生成績為第 n-1 號學生成績 + t[n-1] | |
則下列函數的設計方式如下: | |
遞迴兩個主要因素: A.score(n) 與 score(n-1) 的關係為 score(n) = score(n-1)+t[n-1] B.score(1) = 67 |
迴圈版 |
遞迴版 |
|
#include <stdio.h> |
#include <stdio.h> #include <stdlib.h> int t[]={0, 6, -4, 10, 1, -8, 7, -5, 12, 3}; int score(int n){ if(n==1){ printf("1. 67\n"); return(67); } else{ int s; s=score(n-1)+t[n-1]; printf("%d. %d\n", n, s); return(s); } } int main(){ score(10); } |