怎麼用函數實現求n的階乘,咱們現用循環的方式實現:ide
int fac1(int n) { int i = 0; int ret = 1; for ( i = 1; i <= n; i++) { ret *= i; } return ret; } int main() { //求n的階乘 int n = 0; int ret = 0; scanf("%d", &n); //ret = fac1(n);//循環的方式 printf("%d\n", ret); return 0; }
這裏咱們首先要知道n的階乘是123...n,因此咱們定義一個變量i,固然i !=0,這樣使用for循環知足條件輸出ret =i,等於ret = ret i。輸出ret,這樣就求出i的階乘。
接下來咱們用遞歸的方法來實現:函數
int fac2(int n) { if (n <= 1) return 1; else return n*fac2(n - 1); } int main() { //求n的階乘 int n = 0; int ret = 0; scanf("%d", &n); ret = fac2(n); printf("%d\n", ret); return 0; }
用遞歸的方法怎麼實現呢,咱們來找一下規律,不管n(n!=0)等於幾它的第一位永遠是1,因此if函數判斷n<=1的狀況下,輸出1,else就是n>1的狀況下,輸出n(n-1),爲何是輸出n(n-1)呢,由於n的階乘等於123...(n-1)n,因此當n大於1的時候輸出n(n-1)。測試
怎麼用函數描述第n個斐波那契數:
咱們首先要知道什麼是斐波那契數列:
1 1 2 3 5 8 13 21 34 55 從這組數字能夠得出斐波那契數列的規律就是第三個數字等於前面兩個數字的和,接下來就是用遞歸的方法實現:code
int fib(int n) { if (n <= 2) return 1; else return fib(n - 1) + fib(n - 2); } int main() { int n = 0; int ret = 0;; scanf("%d", &n); //TDD -測試驅動開發 ret = fib(n); printf("ret = %d\n", ret); return 0; }
當n<=2的時候,數列的前兩項都是1,因此輸出一個1
可是當n>2的時候,咱們知道斐波那契數列的規律就是第三個數字等於前面兩個數字的和,因此這裏用(n-1)+(n-2),表明的是當咱們要求第n個數的時候,它是由(n-1)+(n-2)得來的,也就是n前一位數和n前兩位數,它們相加的和也就是第n個斐波那契數。遞歸
可是用遞歸的方法求斐波那契數列的效率很低,因此在這咱們能夠用循環的方法來求。開發
int fib(int n) { int a = 1; int b = 1; int c = 1; while (n > 2) { c = a + b; a = b; b = c; n--; } return c; } int main() { int n = 0; int ret = 0;; scanf("%d", &n); //TDD -測試驅動開發 ret = fib(n); printf("ret = %d\n", ret); return 0; }
當咱們要求第n個數的時候,咱們要用前兩個數的和來獲得第三個數,因此這裏咱們定義三個數分別爲a,b,c,而且規定a+b=c,這時候咱們須要用到while循環,可是循環條件怎麼填呢,咱們知道當n<=2的時候,永遠輸出的值爲1,只有大於2 的時候,纔會不斷的增長,因此循環條件咱們就輸入n>2,假設咱們求第3個斐波那契數,1+1=2,當咱們要求第4個數的時候是否是用,1+2=3,此時的a變成了以前的b,b變成了以前的c,而c又等於a+b,這樣不就構成了循環,最後的n--;表明沒執行一次n就-1,這樣當n<=2時跳出循環輸出c。it
2021.1.25
永遠相信傻瓜計算機for循環