C语言递归算法传引用参数方法及数组最大值递归传引用问题排查
C语言递归中的引用传递及数组最大值递归实现问题解答
首先得明确一点:C语言本身没有像C++那样的原生引用类型,我们平时说的“引用传递”,本质上是通过指针来实现的——把变量的内存地址传给函数,函数通过指针间接修改原变量的值。在递归场景下使用的话,逻辑和普通函数一致:只需要在递归函数的参数列表里声明指针类型,递归调用时传递同一个指针地址就行,这样每一层递归都能操作同一个内存位置的数据。
接下来看你遇到的递归找数组最大值的问题,按你说的改成引用传递(指针传结果)后没输出,大概率是这几个地方出了问题:
- 没有正确初始化
result或者在递归终止时给*result赋值初始值 - 调用递归函数时没传
result的地址(应该传&result而不是result) - 递归过程中没有正确更新
*result的值 - 主函数最后没打印
result的值
我给你写了一份能正常运行的完整代码,你可以参考对比自己的代码:
#include <stdio.h> #include <stdlib.h> // 递归函数:通过指针result传递最终的最大值结果 void search(int a[], int tam, int current_idx, int *result) { // 递归终止条件:遍历到最后一个元素,先把它设为当前最大值 if (current_idx == tam - 1) { *result = a[current_idx]; return; } // 先递归处理后面的元素,找到后面部分的最大值 search(a, tam, current_idx + 1, result); // 回溯时比较当前元素和已找到的最大值,更新结果 if (a[current_idx] > *result) { *result = a[current_idx]; } } int main() { int tam = 5; int array[5] = {3, 7, 2, 9, 5}; // 你可以换成自己的测试数组 int result; // 调用递归函数,从索引0开始,传入result的地址 search(array, tam, 0, &result); // 关键!一定要打印结果,不然你看不到输出 printf("数组的最大值是:%d\n", result); return 0; }
这里的关键点说明一下:
- 我把原来的
max参数换成了current_idx来跟踪遍历位置,这样逻辑更清晰,避免初始max值设置错误的问题; - 递归终止时先把最后一个元素赋值给
*result,作为初始的最大值,然后回溯的时候依次和前面的元素比较更新; - 调用
search时必须传&result,这样函数才能修改主函数里的result变量; - 主函数最后一定要用
printf输出result,不然就算计算对了也看不到结果。
如果你的代码里还有其他细节问题,比如数组初始化错误、递归条件写错,可以对照上面的代码排查一下。
内容的提问来源于stack exchange,提问作者Antwoord
相关产品推荐
相关产品推荐

