You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归实现删除数组强数的函数误删全部元素,求错误原因

排查递归删除强数函数的错误

让我一步步拆解这个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:10:18