编写求整型数组最值与和的递归函数时的初始化及逻辑疑问
问题解答
1. 为什么教授的代码不需要提前初始化三个指针指向的变量?
核心区别是你们的递归处理顺序完全不同:
- 你的代码是前序处理逻辑:先判断当前元素、更新三个变量的值,再进入下一层递归,所以必须在调用函数前就给
*min、*max、*sum赋初始值,否则第一次判断时读取的是内存野值。 - 教授的代码是后序处理逻辑:先进入下一层递归,等递归返回后再处理当前元素,整个递归的第一次赋值操作就是终止条件里的赋值,这本身就是初始化步骤,完全不需要额外在函数外做初始化。
2. 终止条件的赋值会不会覆盖之前的计算结果?
不会,终止条件的赋值是整个计算流程的起点,此时还没有任何计算结果产生,不存在覆盖的问题。
我们以数组[3,1,2]为例,递归执行流程如下:
- 第一层传入数组
[3,1,2],长度3≠1,直接调用下一层处理子数组[1,2] - 第二层传入数组
[1,2],长度2≠1,直接调用下一层处理子数组[2] - 第三层传入数组
[2],触发终止条件,赋值*min=*max=*sum=2,返回第二层 - 第二层处理当前元素
1:*sum = 2+1=3,*min取1和2的最小值1,*max取1和2的最大值2,返回第一层 - 第一层处理当前元素
3:*sum = 3+3=6,*min取1和3的最小值1,*max取2和3的最大值3,函数执行结束
可以看到,终止条件的赋值是所有计算的基础,后续回溯阶段都是在这个初始值的基础上做更新,完全不会覆盖有效结果。
补充:你的代码存在的问题
- 你写的
sum+=arr[0]是错误的:sum是指针变量,你修改的是指针本身的内存地址,而非指针指向的求和变量,应该改为*sum += arr[0] - 你的终止条件直接return,没有对三个变量做赋值,当输入数组长度为1时,返回的结果还是调用前的野值,逻辑不成立
内容的提问来源于stack exchange,提问作者Fang Yuan
相关产品推荐
相关产品推荐

