限制性斐波那契序列
P粉463811100
2023-08-16 19:46:31
<p>我想实现一个函数,从<code>N</code>到<code>N+K</code>生成斐波那契数列,并返回<code>array[K]</code>个元素,其中<code>(0<=N<=370; 0<=N+K<=371; 0<=K<=255)</code>。
当输入为<code>n:370, k:1</code>时,最后一个尝试<code>n2</code>超出了需要和范围。我想简化我的代码,而不是使用多个<code>if</code>语句。谢谢。</p><p><strong>更新:</strong></p><p>这是用于区块链的智能合约,其中<code>int</code>是256位,当<code>N+K >= 369</code>时,最后一个循环的<code>n2</code>会溢出。</p>
<pre class="brush:js;toolbar:false;">function getFibSeq(n, k) {
let numbers = [];
let n1 = 0;
let n2 = 1;
let i = 0;
let j = (n + k);
while (i < j){ if((i - n) >= 0){
output.push(n1);
}
if((j - i - 1) > 0){
let temp = n1;
n1 = n2;
if((j - i - 2) > 0) {
n2 = temp + n2;
}
}
i = i + 1;
}
return output;
}
</pre>
<p><br /></p>
有一个用于计算第n个斐波那契数的封闭公式,被称为Binet公式。这使您可以在
O(1)
的渐近时间复杂度内获得第n个数。下面是一个示例,展示如何计算任意
n
的斐波那契数。将此扩展以解决您的特定问题。我建议计算
n-1
和n
的值。然后迭代k次以获得所需的值。在进行迭代时跟踪结果,您应该没问题。注意:尽管此公式对于较小的
n
值给出精确结果,但由于JavaScript中浮点运算的限制,对于较大的值可能会失去精度。