请求将统计非零数组符号变化次数的非递归代码改写为递归实现
递归实现非零数组的符号变化次数统计
先看你的非递归逻辑:遍历数组的每一对相邻元素,只要前后符号不同(一个负、一个非负,或者反过来),就计数加1,最后返回总次数。要改成递归的话,核心是把“遍历”拆解成递归的子问题:
- 终止条件:当数组长度
n <= 1时,没有相邻元素可以比较,直接返回0。 - 递归逻辑:先递归计算前
n-1个元素的符号变化次数,再检查最后一对元素(arr[n-2]和arr[n-1])是否符号不同,是则在子问题的结果上加1,否则直接返回子问题的结果。
下面是改写后的递归代码:
int recur_change_sign(int* arr, int n) { // 终止条件:数组长度不足2,没有相邻元素 if (n <= 1) { return 0; } // 递归计算前n-1个元素的符号变化次数 int count = recur_change_sign(arr, n - 1); // 检查最后一对相邻元素的符号是否不同 if ((arr[n-2] < 0 && arr[n-1] >= 0) || (arr[n-2] >= 0 && arr[n-1] < 0)) { count++; } return count; }
补充说明
- 递归的每一步都只处理当前数组的最后一对元素,把前面的部分交给子递归处理,和非递归的遍历顺序本质一致(非递归从前往后,递归从后往前拆解,但结果完全相同)。
- 因为题目明确是非零数组,你也可以把符号判断条件简化成
arr[n-2] * arr[n-1] < 0——两个非零数相乘为负,说明符号必然不同,效果和原代码完全一致:if (arr[n-2] * arr[n-1] < 0) { count++; }
内容的提问来源于stack exchange,提问作者Exwyzed
相关产品推荐
相关产品推荐

