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

递归实现的下一个素数函数返回非素数的问题排查求助

递归实现下一个素数函数的错误排查与修复

我帮你排查出问题啦!你的递归函数逻辑里有个关键错误——递归调用的时候没有返回结果!

问题根源分析

当代码发现当前的z不是素数时,确实调用了ft_find_next_prime(++z)去查找下一个数的素数,但这个递归调用的结果根本没被返回给上层!也就是说,递归执行完之后,程序又回到原来的函数里继续跑循环,最后返回的还是一开始那个非素数的z,这就是为什么输入32会返回35、输入35也返回35的原因——递归白跑了,结果没传回来。

举个具体例子:当检查35的时候,发现它能被5整除,于是调用ft_find_next_prime(36),但调用完这个递归之后,你的代码继续执行i--,把i从5减到4,一路减到1后循环结束,直接返回了原来的z=35,完全没用到递归找到的正确素数37!

修复方案

修复方法特别简单,只需要给递归调用加上return,让递归的结果能正确传递回上层调用:

把原来的:

ft_find_next_prime(++z);

改成:

return ft_find_next_prime(++z);

另外我还帮你补充了一个边界处理:素数的定义是大于1的自然数,所以当输入nb <= 1时,直接返回最小的素数2会更合理。

修复后的完整代码

#include <stdio.h>
#include <unistd.h>

int ft_find_next_prime(int nb) {
    int i;
    int z = nb;
    // 处理小于2的输入,返回最小素数2
    if (z <= 1) {
        return 2;
    }
    i = z - 1;
    while (i > 1) {
        if ((z % i) == 0) {
            // 返回递归调用的结果,确保正确传递素数
            return ft_find_next_prime(++z);
        } else {
            i--;
        }
    }
    return z;
}

int main(void) {
    int i;
    i = 1;
    printf("\n\tNUMERO\t---\tSIGIENTE PRIMO\n");
    printf("-----------------------------------------------------\n");
    while (i <= 100) {
        printf("\t%i\t---\t%i\n", i, ft_find_next_prime(i));
        i++;
    }
    return (0);
}

现在你再测试输入32、35、95这些场景,就能得到正确的下一个素数结果啦~

内容的提问来源于stack exchange,提问作者Deepblack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 18:24:11