---
# System prepended metadata

title: 大一上期末考題(遞迴函式) -2022/1/10-
tags: [程式設計]

---

###### 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;                 /*回傳遞迴函式*/
}

```