# 實作題 - 函數運算求值 - 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]