Golomb序列

时间:2012-06-10 19:22:52

标签: javascript node.js

我正在尝试解决一个小编程挑战,即计算Golomb序列的第n个数字(有关更多帮助,请参阅this)。我写了一个简单的解决方案,但它可能有任何问题,因为250000位置的数字是10813,但我的程序给了我10814。

var golomb = (function(){
    var cache = [null, 1];
    const o = 0.5 * (1 + Math.sqrt(5)); // Golden ratio 
    return function(n){
        return cache[n] || (function(){
            return Math.round(Math.pow(o, 2-o) * Math.pow(n, o-1));
        })();
    };
})();

var num = golomb(process.argv[2]);
console.log(num);

也许,黄金比例需要比JavaScript更长的时间。有人可以帮忙吗?感谢。

3 个答案:

答案 0 :(得分:1)

Sgmonda,你从Wolfram Alpha获得的公式并不是一个确切的解决方案。我实际上向他们抱怨过,因为我喜欢Golomb序列。即使您缓存它,重复关系也很准确但很慢。嘿,这就是为什么编程挑战是一个挑战。

答案 1 :(得分:0)

来自the wikipedia article

  

Colin Mallows明确表示复发关系:

a(1) = 1;
a(n + 1) = 1 + a(n + 1 − a(a(n)))

您需要在这个使用整数的迭代方法中实现您的解决方案。

尝试实施的快速尝试给出了:

function golomb(n) {
    if(n == 1) return 1;
    else return 1 + golomb(n − golomb(golomb(n-1)));
}

答案 2 :(得分:0)

对于它的价值,这里有一个基于递归关系的函数,带有缓存,可以很快给出正确的答案

var golomb = (function() {
    var cache = [null, 1];
    return function(n) {
       var i;
       for (i=cache.length;i<n;i++) cache[i]=golomb(i);
       return cache[n] || (cache[n]=1+golomb(n-golomb(golomb(n-1))));
    }
})();

jsFiddle

上查看