递归实现的下一个素数函数返回非素数的问题排查求助
递归实现下一个素数函数的错误排查与修复
我帮你排查出问题啦!你的递归函数逻辑里有个关键错误——递归调用的时候没有返回结果!
问题根源分析
当代码发现当前的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
相关产品推荐
相关产品推荐

