在尝试使用递归查找集合子集的总数时,我遇到了分割错误

while trying to find total number of subset of a set using recursion, I am getting segmentation fault

本文关键字:遇到 错误 分割 递归 子集 集合 查找      更新时间:2023-10-16

//递归程序来查找集合的所有子集

#include<iostream>
using namespace std;
const int n =3;
int arr[n]={1,2,3};
void pass(int *tmp,int tmpArrayIndex, int OriginalArrayIndex)    
/*
*   int* tmp is temporary array to store 
*   int tmpArrayIndex == size of array is diiferent at different level, indicates the position to insert element
*   int OriginalArrayIndex == positon of element in original array for which decision is to made ot select or reject a element
*/
{
if(OriginalArrayIndex == n)
{
cout<<tmp<<endl;
return;
}
tmp[tmpArrayIndex] = arr[OriginalArrayIndex];
pass(tmp,tmpArrayIndex+1,OriginalArrayIndex+1);
pass(tmp,tmpArrayIndex,OriginalArrayIndex+1);
}
int main(void)
{
int *tmp;
pass(tmp,0,0);
return 0;
}

程序编译成功,但在执行时显示分段错误。 上述程序的预期输出应为 123 12 13 1 23 2 空 总共 8 个子集为 2^3=8。

没有"数组"tmp的引用或指针。变量tmp是一个指针 true,但如果你这样做tmp = new int[3]那么tmp将指向arr无关的新数组的第一个元素。tmp[i] = arr[i]复制元素,两个数组仍然是不同且独立的,并且tmp指向的数组中的任何内容都不会"引用"或"指向"arr的任何元素。

从图形上看,两个数组和指针将如下所示(tmp = new int[3]之后(:

+--------+--------+--------+ |到达[0] |到达[1] |抵达[2] | +--------+--------+--------+ +-----+     +--------+--------+--------+ |TMP |--> |TMP[0] |TMP[1] |TMP[2] | +-----

+ +--------+--------+--------+这两个数组是两个独立且不同的实体,没有关系。


如前所述

tmp[i] = arr[i];

将值从arr[i]复制到tmp[i]。这类似于做

int temporary_value_copy = arr[i];
tmp[i] = temporary_value_copy;

有了上面的两行,你还会声称tmp[i]"参考"或"点"arr[i]吗?我希望不会。


此外(如前所述(,由于tmp是一个指针,那么

std::cout << tmp;

将打印指针本身,而不是它可能指向的可能数据。要打印tmp指向的数组的所有元素,您需要一个循环:

for (size_t i = 0; i < 3; ++i)
std::cout << tmp[i];

根据某个程序员的建议更正代码

#include<iostream>
using namespace std;
const int n =3;
int arr[n]={1,2,3};
void pass(int *tmp,int tmpArrayIndex, int OriginalArrayIndex)
{
if(OriginalArrayIndex == n)
{
for(int j=0;j<tmpArrayIndex;++j)
cout<<tmp[j]<<" ";
cout<<endl;
return;
}
tmp[tmpArrayIndex] = arr[OriginalArrayIndex];
pass(tmp,tmpArrayIndex+1,OriginalArrayIndex+1);
pass(tmp,tmpArrayIndex,OriginalArrayIndex+1);
}
int main(void)
{
int* tmp = new int[n];
int tmpArrayIndex = 0;
int OriginalArrayIndex = 0;
pass(tmp, tmpArrayIndex,OriginalArrayIndex);
return 0;
}

输出:

1 2 3 
1 2 
1 3 
1 
2 3 
2 
3

这是预期的输出。

PS: a newline after last output entry i.e 3, indicates empty subset.