C语言实现数组所有子序列打印程序存在重复子序列输出问题
问题排查与代码修正
你的代码出现重复输出1 3 0且缺失1 0 0的问题,根源在于未初始化辅助数组和递归未做回溯操作,咱们一步步来看:
错误原因
辅助数组
arr2未初始化
在main函数中,你声明了int arr2[3];但没有初始化,这会导致数组元素是内存中的随机垃圾值。虽然运行时可能碰巧是0,但这属于未定义行为,会为后续递归埋下隐患。递归选择元素后未回溯
当你选择将当前元素加入子序列(即执行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
相关产品推荐
相关产品推荐

