вектор — воспоминание Коллатца с картой C ++

Я решил написать код, который вывел бы дерево Коллатца. Это, вероятно, придется ждать другого вопроса; текущий вопрос таков:

Мы хотим вычислить последовательность Коллатца для данного числа только один раз, а затем использовать памятку. Вот что я хочу реализовать в своем коде:

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

int collatzize(int x)
{
x % 2 == 0 ? x /= 2 : x = 3 * x + 1;
return x;
}

map<int, vector<int>> collatz_tree;

void tree_fill(int n)
{
vector<int> chain;
chain.resize(n);
chain[0] = n;
int tmp = n;
int counter = 1;
while (tmp != 1)
{
if (collatz_tree.find(tmp) != collatz_tree.end())
//something
tmp = collatzize(tmp);
chain[counter] = tmp;
counter++;
}
int x = 0;
chain.erase(remove_if(chain.begin(), chain.end(), [x] (int thing) {return thing == x; }), chain.end());
collatz_tree.emplace(make_pair(n, chain));
}int output(int a)
{
for (auto it = collatz_tree[a].begin(); it != collatz_tree[a].end(); it++)
cout << *it << "\n" << "|" << "\n";
return 0;
}

int main()
{
int num;
cin >> num;
for (int i = 2; i < num; i++)
tree_fill(i);
output(num);
return 0;
}

Идея такова: для заданного числа вычислите последовательность, проверяя каждый шаг, достигли ли мы числа, для которого мы уже знаем последовательность. Если у нас есть, то просто добавьте соответствующий вектор к текущему вектору.

Пример:

Рано мы должны получить {5, {5,16,8,4,2,1}},
Итак, когда мы вычисляем последовательность, скажем, для 13, мы должны сделать {13, {13,40,20,10, paste_vector_for_5_here}},

Вопрос в том, как лучше всего это сделать, учитывая, что все дерево коллатца реализовано как map<int, vector<int>> ?

Постскриптум

Моя лямбда неуклюжая: я еще не очень хорош с ними.

0

Решение

Задача ещё не решена.

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


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