# 實作題 - 函數運算求值 - APCS - by Peter Wang ## 題目資訊 此題為2019.2測驗中的題目3 ###### tags: `APCS` `遞迴` ## 題目敘述 有三個函數: f(x) = 2x – 3 g(x, y) = 2x +y – 7 h(x, y, z) = 3x – 2y + z 另有一個由這三個函數所組成的運算式,依序給你其中的函數名稱及參數,請求出這個運算式的值。例如: h f 5 g 3 4 3 代表 h(f(5), g(3, 4), 3) =h(7, 3, 3) =18 ### 輸入: 輸入只有一行,含有運算式中所有的函數名稱及參數值,兩兩以一個空白隔開。函數名稱為 f、g、h 其中一個字母,參數值則為一個介於 -1000 及 1000 的整數。 ### 輸出: 輸出運算式的值。運算過程及結果的整數值其絕對值均不大於109。 ## 解題思路 創造出f g h三個函式,用遞迴的概念完成題目。 ## 程式碼 ```clike= #include <iostream> using namespace std; int f(),g(),h(),strtoint(); int strtoint(string str){ int len=str.length(); int ans=0; if(str[0]=='-'){ for(int i=1;i<len;i++){ ans*=10; ans+=str[i]-'0'; } return -ans; } else{ for(int i=0;i<len;i++){ ans*=10; ans+=str[i]-'0'; } return ans; } } int f(){ int r=0; string ch1; cin>>ch1; if(ch1=="f") r=f(); else if(ch1=="g") r=g(); else if(ch1=="h") r=h(); else r=strtoint(ch1); return 2*r-3; } int g(){ int r1=0; string ch1; cin>>ch1; if(ch1=="f"){ r1=f(); } else if(ch1=="g"){ r1=g(); } else if(ch1=="h"){ r1=h(); } else r1=strtoint(ch1); int r2=0; string ch2; cin>>ch2; if(ch2=="f") r2=f(); else if(ch2=="g") r2=g(); else if(ch2=="h") r2=h(); else r2=strtoint(ch2); return 2*r1+r2-7; } int h(){ int r1=0; string ch1; cin>>ch1; if(ch1=="f") r1=f(); else if(ch1=="g") r1=g(); else if(ch1=="h") r1=h(); else r1=strtoint(ch1); int r2=0; string ch2; cin>>ch2; if(ch2=="f") r2=f(); else if(ch2=="g")r2=g(); else if(ch2=="h") r2=h(); else r2=strtoint(ch2); int r3=0; string ch3; cin>>ch3; if(ch3=="f") r3=f(); else if(ch3=="g") r3=g(); else if(ch3=="h") r3=h(); else r3=strtoint(ch3); return 3*r1-2*r2+r3; } int main() { char ch; while(cin>>ch){ int ans=0; if(ch=='f') ans=f(); else if(ch=='g') ans=g(); else if(ch=='h') ans=h(); cout<<ans<<endl; } } ``` ## 資料來源 [zerojudge](https://zerojudge.tw/) [題目敘述](https://zerojudge.tw/ShowProblem?problemid=f640) ## 備註 >[name=PeterWang] >[time=Fri, Aug 13, 2021 4:26 PM]