###### tags: `程式設計`
# 大一上期末考題(遞迴函式) -2022/1/10-
請服用
## 第一題: 求m屬於NU{0}所有位數之和
```c=
#include <stdio.h>
int add (int m, int sum=0){ /*設一個函式,m是變數,sum是放所有位數的和*/
if (m<10){ /*這是最後一步,return的值會是前n-1項之和+第n項 */
return sum+m;
}
return add(m/10, sum+m%10); /*這是會一直重複的部分,每次m的值回傳除10之後的*/
} /*整數,sum則是會把前一次的和+ m除10的餘*/
/*數,然後回傳,再重複做*/
int main(){
int m=234; /*給m變數一個值*/
int ans; /*設一個變數ans裝遞迴函式的值*/
ans=add(m);
return ans; /*把值回傳*/
}
```
## 第三題: 求兩自然數m與n的最小公倍數
```c=
#include <stdio.h>
int gcd (int m, int n){
if (m%n==0){ /*先設一個求最大公因式的函式,如果n>m那就會做else先*/
return n; /*反轉把n放入m、m除n的餘數放入n。只要m除n不是0*/,
} /*就會做就會做以上反轉的事*/
else {
return gcd(n,m%n);
}
}
int lcm (int m, int n){ /*第二個函式是做最小公倍數,回傳的值是將m*n除最大公音的值*/
return (m*n)/gcd(m,n); /*利用輾轉相除法的到的想法*/
}
int main(){
int m=6,n=3; /*給變數值*/
int ans; /*設變數ans裝lcm的值,之後回傳*/
ans=lcm(m,n);
return ans;
}
```
## 第六題: 求m屬於NU{0}有幾個位數是奇數
```c=
#include <stdio.h>
int odd(int m){
if (m>0){ /*在m>0時做底下的事。*/
if (m%2==0) /*如果m除2的餘數是0就會回傳m除10的函*/
return odd(m/10); /*式,然後就像迴圈一樣浮額條件就重複做*/
else
return odd(m/10)+1; /*在餘數不是0的情況就會回傳odd函式+1(最後函*/
} /*式的值被算出來就會相加*/
return m; /*情況在m小於或等於的時候成立*/
}
int main(){
int m=26489; /*給變數一個值*/
int ans; /*變數ans是放odd的值*/
ans=odd(m);
return ans; /*最後再將值回傳*/
}
```
## 第七題: 計算1+3+5+(2n+1),n屬於NU{0}
```c=
#include <stdio.h>
int all (int n){ /*輸入一個變數,此變數是1的話就回傳1 */
if (n==1) /*(因為也沒有其他可以加的數字*/
return 1;
else /*其他情況是將n與all函數的值相加回傳(所以最後函 */
return all(n-2)+n; /*式裡面的值知道後就會加起來)*/
}
int main(){
int n=7; /*給變數n一個值跟ans裝遞迴函式的值*/
int ans;
ans=all(n);
return ans; /*最後回傳*/
}
```
## 第八題: 計算m屬於NU{0}的MSB(most significant digit)
```c=
#include <stdio.h>
int msb (int m){ /*設一個函式裡面有一個變數m,該變數的範圍*/
if (10 > m > 0) /*只能在10~0之間時(不含10跟0),就會回傳m */
return m; /*到此函式*/
else
return msb(m/10); /*當m不符合上述條件就會做回傳函式*/
} /*到此函式*/
int main(){
int m=45682; /*給變數m一個值*/
int ans; /*設一個變數ans裝遞迴函式的值*/
ans=msb(m);
return ans; /*回傳函式的值*/
}
```
## 第九題: 計算n!,n屬於NU{0}
```c=
#include <stdio.h>
int s(int n){ /*設一個函式,如果輸入的n==1就回傳1*/
if (n==1)
return 1;
else /*不符合就會回傳 n-1的值*n(這就是n!的算法*/
return s(n-1)*n;
}
int main(){
int n; /*給變數n一個值*/
int ans; /*設一個變數ans,此變數裝遞迴函式的值*/
ans=s(n);
return ans; /*回傳ans的值*/
}
```
## 第十題: 如果c語言不提供乘法,請在此限制下,求m*n的積,m,n屬於N{0}
```c=
#include <stdio.h>
int mt (int m, int n){ /*設一個函式,設m是要加的數字,n是他*/
if (n>1) /*的次數,只要n>1,m就會一直相加*/
return mt(m, n-1)+m;
}
int main(){
int m=2,n=4; /*給變數m、n各一個值*/
int ans; /*設變數ans放入遞迴函式的值*/
ans=mt(m,n);
return ans; /*回傳ans的值*/
}
```
## 第十一題: 如果c語言不提供除法,請在此限制下,求m%n的餘,m,n屬於N{0}
```c=
#include <stdio.h>
int dvs(int m, int n){ /* 設一個函式,m每次要減n,直到m不*/
if (m>n) /*大於n,最後回傳m*/
return dvs(m-n, n);
else
return m;
}
int main(){
int m=10,n=5; /*設變數m、n各有一個值*/
int ans; /*設ans放入遞迴函式*/
ans=dvs(m,n);
return ans; /*回傳遞迴函式*/
}
```