408学习之c语言(递归与函数)

今天主要学习了递归与函数的相关内容,下面将我今天所学知识与所写代码分享给大家

递归核心要点
递归三要素

基准条件(明确终止条件)
递归调用(逐步分解问题)
收敛性(确保每次递归都向基准条件靠近)

常见应用场景

分治算法(如归并排序、快速排序)
树形/图形结构遍历
数学计算(阶乘、斐波那契数列等)
使用注意事项
注意:警惕栈溢出(深度过大时需优化)
避免重复计算(可采用记忆化优化)
性能考量(通常比迭代实现效率低)

**

(一)用递归查找数组最大值

**`/* 递归查找数组最大值
 * @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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值