記得大學接觸的第一門課程就是C語言,裏面讓我印象深入之一就是遞歸,受大學老師講遞歸的啓發
我嘗試着用最通俗、最易懂的方式講解遞歸。遞歸其實真的不難。以爲遞歸很難的朋友,能夠試試看一下,相信若是你能認真的看完這篇文章,或許會有很大的收穫git
遞歸兩個必要條件:github
**1.遞歸函數** **2.遞歸出口**
下面的練習會讓你清晰的發現,遞歸其實就是要找 遞歸函數和遞歸出口 這兩步數組
練習
函數
邏輯分析:測試
遞歸函數:f(n) = f(n-1)+2;
遞歸出口:f(1) = 1;spa
代碼實現code
/** 假設有個數列 1 3 5 7 9 11 .... 遞歸函數:f(n) = f(n-1)+2; 遞歸出口: f(1) = 1; @param n 求n項的值 @return 返回第n項的值 */ int find(int n) { if (n == 1) {// 遞歸出口 return 1; } else {//遞歸函數 return find(n-1)+2; } }
邏輯分析:遞歸
遞歸函數:fibonacci(n) = fibonacci(n-1)+fibonacci(n-2)
遞歸出口:fibonacci(1) = 1,fibonacci(2) = 1;圖片
代碼實現ci
/** fibonacci 斐波那契數列 1 1 2 3 5 8 13 21 .... 遞歸函數:fibonacci(n) = fibonacci(n-1)+fibonacci(n-2) 遞歸出口:fibonacci(1) = 1,fibonacci(2) = 1; @param n 求第n項 @return 返回第n項的值 */ int fibonacci (int n) { if (n==1 || n==2) { // 遞歸出口 return 1; } else { //遞歸函數 return fibonacci(n-1)+fibonacci(n-2); } return 0; }
邏輯分析:
遞歸函數:sum(n) = sum(n-1)+n
遞歸出口:f(1) = 1
代碼實現
/** //有序數列 求和:1+2+3+4+...+100 遞歸函數:sum(n) = sum(n-1)+n 遞歸出口:f(1) = 1 @param n 前n項 @return 返回 前n項的和 */ int sum(int n) { if (n == 1) { return 1; } else { return sum(n-1)+n; } }
邏輯分析:
遞歸函數:sum1(arr,n) = sum1(arr,n-1)+arr[n];
遞歸出口:sum1(arr,0) = arr[0]
代碼實現
/** //無序數列 求前n項的和:int arr[] = {1, 7, 8, 6, 8, 9, 0, 10} 遞歸函數:sum1(arr,n) = sum1(arr,n-1)+arr[n]; 遞歸出口:sum1(arr,0) = arr[0] @param arr 數組 @param n 求數組中第幾項 @return 返回中前n項的和 */ int sum1(int arr[], int n) { if (n == 0) { return arr[0]; } else { return sum1(arr,n-1)+arr[n]; } }
邏輯分析:
遞歸函數:
if (findMaxNum(arr, n-1) > arr[n]) { return findMaxNum(arr, n-1); } else { return arr[n]; };
遞歸出口: n == 0 return arr[0];
代碼實現
/** //無序數列 求數組中前n項的最大值:int arr1[] = {7, 4, 8, 6, 8, 9, 11, 5} 遞歸函數: if (findMaxNum(arr, n-1) > arr[n]) { return findMaxNum(arr, n-1); } else { return arr[n]; }; 遞歸出口:n == 0 return arr[0]; @param arr 數組 @param n 求數組中前n項的最大值 @return 返回數組中前n項的最大值 */ int findMaxNum(int arr[], int n) { if (n == 0) { return arr[0]; } else if (findMaxNum(arr, n-1) > arr[n]) { return findMaxNum(arr, n-1); } else { return arr[n]; } }
int num ; num = find(6); printf("第6項的值爲%d\n",num); num = fibonacci(6); printf("第6項的值爲%d\n",num); num = sum(100); printf("前100項的和爲%d\n",num); int arr[] = {1, 7, 8, 6, 8, 9, 0, 10}; num = sum1(arr,7); printf("前7項的和爲%d\n",num); int arr1[] = {7, 4, 8, 6, 8, 9, 11, 5}; num = findMaxNum(arr1, 7); printf("前7項的最大值爲%d\n",num);
不積跬步,無以致千里
當咱們踏上一條路,便不要再問路有多遙遠,處境是否坎坷。咱們不斷的走走停停,繁華的是風景,荒蕪的是歲月。