使用C ++地图进行Collat​​z记忆

时间:2014-11-05 09:28:03

标签: c++ vector map collatz

我决定编写输出Collat​​z树的代码。那可能要等待另一个问题;目前的问题是:

我们只想计算一次给定数字的Collat​​z序列,然后使用memoization。这就是我希望在我的代码中实现的内容:

#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}}

问题是:考虑到整个collat​​z树是作为map<int, vector<int>>实现的,最好的方法是什么?

P.S。

我的lambda很笨拙:我对他们还不是很好。

0 个答案:

没有答案