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

编写C语言递归void函数打印数组质数索引元素的代码问题求助

递归打印数组质数索引元素问题排查

原代码存在的问题

  • 主函数传参错误:prime(arr[100], 100)中arr[100]是数组越界访问的单个int元素,不符合函数第一个参数的int数组指针要求,应该直接传入数组名arr。
  • 质数判断逻辑错误:现有代码只要循环中遇到一个不能整除n的数就直接打印,无法正确判定质数,需要等整个循环遍历完所有可能的因子,确认没有整除项,且n≥2时才能判定为质数。
  • 索引与数组元素对应错误:递归时使用arr+1偏移数组指针,会导致后续递归中arr[n]的取值和实际原始索引完全不匹配,不需要偏移数组,直接传递原始数组和当前待判定的索引即可。
  • 打印语句无换行,多次输出会拼接在一起可读性差。
  • 未处理边界值:n=1时不满足质数要求,无需判断直接进入下一层递归。

修正后完整代码

#include <stdio.h>

// 辅助函数:判断一个数是不是质数
int is_prime(int num) {
    if (num < 2) return 0;
    for (int i = 2; i <= num / i; ++i) {
        if (num % i == 0) return 0;
    }
    return 1;
}

// 递归函数:arr是目标数组,cur_idx是当前待判断的索引,max_len是数组总长度
void prime(int arr[], int cur_idx, int max_len) {
    // 递归终止条件:当前索引超过数组最大下标
    if (cur_idx >= max_len) return;
    // 当前索引是质数就打印
    if (is_prime(cur_idx)) {
        printf("Number %d has a prime index %d.\n", arr[cur_idx], cur_idx);
    }
    // 递归处理下一个索引
    prime(arr, cur_idx + 1, max_len);
}

int main()
{
    int arr[100];
    
    for (int i = 0; i < 100; ++i)
    {
        arr[i] = i;
    }
    // 从索引0开始遍历判断
    prime(arr, 0, 100);
    return 0;
}

实现说明

void类型的递归函数不需要返回值,只需要在每一层完成当前索引的判定打印任务,然后调用自身处理下一个索引即可,遇到终止条件就直接return结束当前层递归。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:06:04