алгоритм — перестановочная функция

Я пишу перестановочную функцию, которая создает вектор целых из параметра n и чередует их, используя рекурсию. Я получаю ошибку сегментации, но испытываю большие затруднения, пытаясь заставить это работать. Вот мой код:

void print(const vector<int>& v)
{
for (auto it = v.begin(); it != v.end(); ++it)
{
cout << *it << ' ';
}

cout << endl;
}

vector<vector<int> > interleave(int x, const vector<int>& v)
{
size_t i;
vector<vector<int> > results;

for (i=0;i<=v.size();i++)
{
vector<int> temp(v);

temp.insert(temp.begin()+i, x);
results.push_back(temp);
}

return results;
}

vector<vector<int> > permute(size_t n)
{
size_t i, j;
vector<vector<int> > v;
auto vectors = permute(n-1);
vector<vector<int> > results;
for (j=0;vectors.size();j++)
{
for (i=1;i<=n-1;i++)
{
vectors[j].push_back(i);
}
}

for (j=0;j<=vectors.size();j++)
{
for (i=1;i<=n-1;i++)
{
vector<vector<int> > temp = interleave(i,vectors[j]);
results.insert(results.end(), temp.begin(), temp.end());
}
}

return results;
}

int main(void)
{
size_t i;
vector<vector<int> > results = permute(3);
for (i=0;i<results.size();i++)
{
print(results[i]);
}
}

1

Решение

permute () бесконечно рекурсивен: он всегда будет вызывать permute (n-1). В конечном итоге это может привести к переполнению стека — не уверен, почему вы получаете ошибку сегментации (возможно, есть другие проблемы с кодом).

Также:

for (j=0;vectors.size();j++) {

никогда не выйдет. Вы, вероятно, имели в виду:

for (j=0;j<vectors.size();j++) {

Обратите внимание < против <знак равно Если j = vectors.size (), векторы [j] обращаются к элементам за пределами.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]