我正在尝试解决一个小编程挑战,即计算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更长的时间。有人可以帮忙吗?感谢。
答案 0 :(得分:1)
Sgmonda,你从Wolfram Alpha获得的公式并不是一个确切的解决方案。我实际上向他们抱怨过,因为我喜欢Golomb序列。即使您缓存它,重复关系也很准确但很慢。嘿,这就是为什么编程挑战是一个挑战。
答案 1 :(得分:0)
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))));
}
})();
上查看