递归实现删除数组强数的函数误删全部元素,求错误原因
让我一步步拆解这个deletestrong函数里的问题,这几个错误叠加起来导致了它误删全部元素的问题:
1. 函数调用的括号位置错误(最关键的触发点)
看这行代码:
if(checkstrong(arr[current]==1)){
你把判断条件arr[current]==1直接塞进了checkstrong的参数里!这意味着你不是把数组元素arr[current]传给checkstrong去判断是不是强数,而是把arr[current]是否等于1的布尔结果(0或1)传进去了。
假设checkstrong(1)返回1(因为1是强数),那不管你的数组元素是什么,只要arr[current] != 1,你传给checkstrong的就是0;如果checkstrong(0)也错误返回1的话,所有元素都会被判定为强数,直接被全部删除。哪怕checkstrong(0)返回0,这个逻辑也完全偏离了你的需求——正确的写法应该是先把元素传给checkstrong,再判断它的返回值是不是1:
if(checkstrong(arr[current]) == 1){
2. 递归调用没有返回更新后的n值
你的函数最后一行是:
deletestrong(arr,n,current);
但这个递归调用返回的更新后数组长度n,你没有传递给上层调用!这会导致每一层递归里修改的n都无法传递回去,主函数拿到的n还是初始值,甚至递归过程中后续的判断都会用错误的n值,彻底打乱逻辑。正确的写法是把递归结果return出去:
return deletestrong(arr,n,current);
3. 删除元素后的递归逻辑优化(可选但更严谨)
当你删除当前元素后,数组后面的元素会前移一位,此时下一个要检查的还是当前current位置(因为这个位置现在是原来的current+1元素),原代码里这部分逻辑是对的,但把递归调用的return写在分支里会更清晰,避免遗漏。
修复后的完整函数
把这些问题修正后,函数应该是这样的:
int deletestrong(int arr[],int n,int current){ if(current >= n){ return n; } if(checkstrong(arr[current]) == 1){ if(current == n-1){ n--; } else { for(int i=current; i < n-1 ;i++){ arr[i] = arr[i+1]; } n--; } // 删除元素后不递增current,当前位置已是新元素,继续检查 return deletestrong(arr, n, current); } else { current++; return deletestrong(arr, n, current); } }
这样修改后,函数就能正确识别强数并删除,不会出现误删全部元素的问题了。
内容的提问来源于stack exchange,提问作者Abhishek Aditya

