我编写了以下递归代码,但结果很奇怪.请帮忙找出我C代码中的错误.

例如,如果我将值n视为10,则输出应为2,3,5,7,11,13,17,19,23,29 但是对于我的代码,输出是2 3 5 7 9 11 13 15 17 19

啊!我试了很久,但就是找不到问题所在.下面是我的递归C代码:

void primeNumbers (int n)
{
    if (n == 0)  
        return;

    static int i = 2;
    
    if (isPrime(i))      
    {
        printf("%d ", i);
        i++;                
        primeNumbers(n - 1);
    }
    else 
    {
        i++;
        primeNumbers(n);
    }
}

判断数字是否为素数的函数:

bool isPrime(int n)
{
    // edge case, not a base case
    if (n <= 1)
        return false;

    static int i = 2; 
    
    if (i > n / 2) 
        return true;
    
    if (n % i == 0) 
        return false;
    
    i++;
    return isPrime(n); // call again with i+1 value
}

输出:[如果N是10]

2 3 5 7 9 11 13 15 17 19

如果我将值n作为10,那么输出应该是2,3,5,7,11,13,17,19,23,29,但在我的代码中,输出是2 3 5 7 9 11 13 15 17 19.

推荐答案

问题是,您为除数使用了一个static变量i,对于要测试的下一个数字,该变量永远不会重置为2.

下面是isPrime的另一种递归实现:

bool testPrime(int n, int div) {
    if (n / div < div)
        return true;
    else
    if (n % div == 0)
        return false;
    else
        return testPrime(n, div + 1);
}

bool isPrime(int n) {
    return n >= 2 && testPrime(n, 2);
}

递归函数可以简化为单个表达式:

bool testPrime(int n, int div) {
    return (n / div < div) || (n % div != 0 && testPrime(n, div + 1));
}

出于同样的原因,枚举函数也是不正确的:static变量i永远不会重置为2,因此该函数只工作一次,并且在测试和打印i之后使用n - 1递归调用它,因此它在中途停止枚举.

对于primeNumbers(),可以采用相同的方法将循环转换为递归调用:

void printPrimes(int p, int n) {
    if (n > 0) {
        if (isPrime(p)) {
            printf("%d ", p);
            printPrimes(p + 1, n - 1);
        } else {
            printPrimes(p + 1, n);
        }
    }
}

void primeNumbers(int n) {
    printPrimes(2, n);
    printf("\n");
}

C++相关问答推荐

理解C中的指针定义

为什么在C中设置文件的位置并写入文件,填充空字符?

通过管道将一个子系统的标准输出发送到另一个子系统的标准输出

为什么双重打印与C中的float具有不同的大小时具有相同的值?

Ruby C Api处理异常

在列表中插入Int指针(C)

为静态库做准备中的奇怪行为

CSAPP微型shell 实验室:卡在sigprocmask

用C++实现余弦函数

在C语言中,指针指向一个数组

为什么我在C代码中得到一个不完整的类型?

有没有一种方法可以用C创建保留限定符的函数?

有没有办法减少C语言中线程的堆大小?

unions 的原子成员是个好主意吗?

如何解释数组中的*(ptr)和*(ptr+2)?

为什么一个在线编译器拒绝这个VLA代码,而本地的Apple clang却不拒绝;t?

atoi函数最大长-长误差的再创造

gdb - 你能找到持有内部 glibc 锁的线程吗?

C 语言中 CORDIC 对数的问题

为什么需要struct in_addr