今天主要學習了遞歸與函數的相關內容,下面將我今天所學知識與所寫代碼分享給大家
遞歸核心要點
遞歸三要素
基準條件(明確終止條件)
遞歸調用(逐步分解問題)
收斂性(確保每次遞歸都向基準條件靠近)
常見應用場景
分治算法(如歸并排序、快速排序)
樹形/圖形結構遍歷
數學計算(階乘、斐波那契數列等)
使用注意事項
注意:警惕棧溢出(深度過大時需優化)
避免重復計算(可采用記憶化優化)
性能考量(通常比迭代實現效率低)
**
(一)用遞歸查找數組最大值
**`/* 遞歸查找數組最大值* @param p1 數組首地址指針* @param sz 當前檢查的索引位置* @return 當前子數組的最大值 */
int find_max(int* p1, int sz) {if (sz == 0) { // 基準條件:只剩首元素時直接返回return p1[sz];}// 遞歸比較前N-1個元素的最大值與當前元素int prev_max = find_max(p1, sz - 1); return (prev_max >= p1[sz]) ? prev_max : p1[sz];
}int main() {int arr1[] = { 1,2,3,74,3,6 };int sz = sizeof(arr1) / sizeof(arr1[0]);printf("max = %d\n", find_max(arr1, sz-1));return 0;
}`
(二)用遞歸計算數組元素之和
/* 遞歸計算數組元素和* @param arr 目標數組* @param l 當前左邊界* @param r 右邊界(固定)* @return 當前子數組的和 */
int sum_arr(int arr[], int l, int r) {if (l == r) { // 基準條件:單個元素直接返回return arr[l];}return arr[l] + sum_arr(arr, l + 1, r); // 當前元素+后續元素和
}int main() {int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };int sz = sizeof(arr) / sizeof(arr[0]) - 1;printf("sum = %d\n", sum_arr(arr, 0, sz));return 0;
}
(三)用遞歸實現冒泡排序
/* 遞歸版冒泡排序* @param p1 數組指針* @param l 固定左邊界(0)* @param r 動態右邊界 */
void bubble_arr(int* p1, int l, int r) {if (l == r) return; // 基準條件:排序完成// 單趟冒泡(異或交換避免臨時變量)for (int i = 0; i < r; i++) {if (p1[i] > p1[i + 1]) {p1[i] ^= p1[i + 1];p1[i + 1] ^= p1[i];p1[i] ^= p1[i + 1];}}bubble_arr(p1, l, r - 1); // 遞歸處理未排序部分
}int main() {int arr[] = { 1,6,7,3,9,5,8,3,4 };int sz = sizeof(arr) / sizeof(arr[0]) - 1;bubble_arr(arr, 0, sz);// 打印結果for (int i = 0; i <= sz; i++) {printf("%d ", arr[i]);}return 0;
}
(四)用遞歸求最大公約數
#include<stdio.h>/* 遞歸求最大公約數* @param a 較大數* @param b 較小數* @return 最大公約數 */
int max_yueshu(int a, int b) {int r = a % b;if (r == 0) return b; // 基準條件:整除時返回除數return max_yueshu(b, r); // 遞歸:轉為求b和余數的公約數
}int main() {int a = 48, b = 18;printf("GCD = %d\n", max_yueshu(a, b));return 0;
}