Найдите первое число Фибоначчи, попадающее в диапазон, по
приближенной формуле, и дальше генерите сложением.
function fibRange( from, to) {
if( isNaN(from) || isNaN(to) || from < 2 || from > to) {
throw "Bad argument(s)";
}
var root5 = Math.sqrt(5), phi = (1 + root5)/2, logPhi = Math.log(phi);
var nFrom = Math.ceil( Math.log((from - 0.5) * root5) / logPhi);
var nTo = Math.floor( Math.log((to+0.5) * root5) / logPhi);
function nthFib(n) {
return Math.round( (Math.pow(phi, n) - Math.pow( -phi, -n)) / (2 * phi - 1));
}
var a = nthFib(nFrom);
var result = [a];
if( nFrom === nTo) return result;
var i = nFrom + 1;
var b = nthFib(i);
while( i <= nTo) {
result.push(b);
b = a + b;
a = b - a;
i++;
}
return result;
}
fibRange(10,377)
/*
13,21,34,55,89,144,233,377
*/