使用递归与数组指针统计数组中指定范围数字数量的问题求助
解决递归统计数组范围内数字数量的问题
我完全理解你卡在这一步的烦躁——递归结合指针确实容易绕弯子,尤其是你已经完成了其他两个功能,就差这最后一个了。咱们先拆解你当前代码里的问题,然后一步步修正它。
你的当前代码存在的问题
看你写的numberOfValuesInRange函数,有三个关键错误:
- 判断条件完全偏离需求:你写的
min+max - *pBegin >= min+max等价于-*pBegin >= 0(两边减去min+max),也就是判断当前元素是否小于等于0,这和你要检查的[min, max]范围完全不相关。 - 递归时没有移动指针:你递归调用的是
numberOfValuesInRange(min, max, pBegin, pEnd),pBegin没有往后移动,这会导致无限递归,永远达不到pBegin >= pEnd的终止条件。 - 没有正确累计计数:你没有根据当前元素是否符合条件来增加计数,只是返回0加递归结果,这肯定得不到正确的总数。
修正后的递归函数
这里是可以正常工作的版本,每一步都有注释说明:
int numberOfValuesInRange(float min, float max, const float *pBegin, const float *pEnd){ // Base case:指针已经走到数组末尾,没有元素可检查,返回0 if(pBegin >= pEnd) return 0; // 判断当前元素是否在指定范围内,符合条件则计1,否则计0 int currentCount = (*pBegin >= min && *pBegin <= max) ? 1 : 0; // 递归处理下一个元素,把当前计数加上后续元素的统计结果 return currentCount + numberOfValuesInRange(min, max, pBegin + 1, pEnd); }
补充:修正你的hasValueInRange函数
顺便提一句,你当前的hasValueInRange其实没有真正递归遍历整个数组——它只检查了第一个元素,就直接返回结果了。如果第一个元素不在范围内,但后面的元素符合条件,这个函数会错误地返回false。这里是修正后的递归版本:
bool hasValueInRange(float min, float max, const float *pBegin, const float *pEnd){ // Base case:遍历完所有元素都没找到符合条件的,返回false if(pBegin >= pEnd) return false; // 当前元素在范围内,直接返回true if(*pBegin >= min && *pBegin <= max) return true; // 否则递归检查下一个元素 return hasValueInRange(min, max, pBegin + 1, pEnd); }
测试验证
现在调用numberOfValuesInRange(2,5, &sampleArray[0], &sampleArray[size]),数组里的2和4符合[2,5]的范围,函数会正确返回2,和你的预期一致。
内容的提问来源于stack exchange,提问作者EriPeri
相关产品推荐
相关产品推荐

