限制性斐波那契序列
P粉463811100
P粉463811100 2023-08-16 19:46:31
0
1
508
<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>
P粉463811100
P粉463811100

全部回覆(1)
P粉098979048

有一個用來計算第n個斐波那契數的封閉公式,稱為Binet公式。這使您可以在O(1)的漸近時間複雜度內獲得第n個數。

下面是一個範例,展示如何計算任意n的斐波那契數。

將此擴展以解決您的特定問題。我建議計算n-1n的值。然後迭代k次以獲得所需的值。在進行迭代時追蹤結果,您應該沒問題。

function fibonacci(n) {
    const phi = (1 + Math.sqrt(5)) / 2;
    const psi = (1 - Math.sqrt(5)) / 2;  // phi的负倒数
    return Math.round((Math.pow(phi, n) - Math.pow(psi, n)) / Math.sqrt(5));
}

// 测试
console.log(fibonacci(10));  // 输出:55

注意:儘管此公式對於較小的n值給出精確結果,但由於JavaScript中浮點運算的限制,對於較大的值可能會失去精度。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板