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