今天主要学习了递归与函数的相关内容,下面将我今天所学知识与所写代码分享给大家
递归核心要点
递归三要素
基准条件(明确终止条件)
递归调用(逐步分解问题)
收敛性(确保每次递归都向基准条件靠近)
常见应用场景
分治算法(如归并排序、快速排序)
树形/图形结构遍历
数学计算(阶乘、斐波那契数列等)
使用注意事项
注意:警惕栈溢出(深度过大时需优化)
避免重复计算(可采用记忆化优化)
性能考量(通常比迭代实现效率低)
**
(一)用递归查找数组最大值
**`/* 递归查找数组最大值* @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;
}