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

C语言实现数组所有子序列打印程序存在重复子序列输出问题

问题排查与代码修正

你的代码出现重复输出1 3 0且缺失1 0 0的问题,根源在于未初始化辅助数组和递归未做回溯操作,咱们一步步来看:

错误原因

  1. 辅助数组arr2未初始化
    在main函数中,你声明了int arr2[3];但没有初始化,这会导致数组元素是内存中的随机垃圾值。虽然运行时可能碰巧是0,但这属于未定义行为,会为后续递归埋下隐患。

  2. 递归选择元素后未回溯
    当你选择将当前元素加入子序列(即执行arr2[index2] = arr[index1];)并递归后,没有将arr2对应位置重置为0。这会导致后续的递归分支(尤其是不选当前元素的分支)继承之前修改的值,从而打印出错误的子序列。比如你遇到的重复1 3 0,就是因为之前选3时修改的arr2[1]没有被重置,后续不选2、不选3的分支误用上了这个残留值。

修正后的代码

#include <stdio.h>

void printAllSubSequences(int arr[], int index1, int arr2[], int index2){
    if (index1 >= 3) {
        for(int i = 0; i < 3 ; i++){
            printf("%d ", arr2[i]);
        }
        return;
    }
    // 分支1:不选当前元素,直接递归
    printAllSubSequences(arr, index1+1, arr2, index2);
    
    // 分支2:选当前元素,递归完成后回溯重置
    arr2[index2] = arr[index1];
    printAllSubSequences(arr, index1+1, arr2, index2+1);
    arr2[index2] = 0; // 回溯:将位置重置为0,避免影响其他分支
}

int main(){
    int arr[3] = {1, 2, 3};
    int arr2[3] = {0}; // 初始化辅助数组为全0,确保未选位置默认是0
    printAllSubSequences(arr, 0, arr2, 0);
    printf("\n");
}

验证结果

修正后运行代码,输入数组{1,2,3}时,输出将与你的预期完全一致:
0 0 0 0 0 3 0 2 0 0 2 3 1 0 0 1 0 3 1 2 0 1 2 3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:42:30