Fibonacci Sequences in JavaScript with/without recursive

  • 2019 年 12 月 4 日
  • 筆記

本文作者:IMWeb link 原文出處:IMWeb社區 未經同意,禁止轉載

介紹幾種使用javascript實現斐波那契數列的方法。

其中第一種和第二種都是使用遞歸:(可優化,應該將每一個元素的值緩存起來,而不是每次遞歸都計算一次)

        //with Recursion          function fibonacci1 (argument) {              // body...              return (argument <= 1 ? argument : fibonacci1(argument - 1) + fibonacci1(argument - 2));          }          window.console.log(fibonacci1(10));            function fibonacci2 (argument) {              return (argument <= 1 ? argument : arguments.callee(argument - 1) + arguments.callee(argument - 2));          }          window.console.log(fibonacci2(10));

這裡可以說一下JS函數實參對象的callee屬性。JS函數的實參對象定義了calleecaller屬性。在ES5嚴格模式中,對這兩個屬性的讀寫操作都會產生一個類型錯誤(TypeError)。而在非嚴格模式下,ES標準規範規定callee屬性指代當前正在執行的函數。caller是非標準的,但大多數瀏覽器都實現了這個屬性,它指代調用當前正在執行的函數的函數。通過caller屬性可以訪問調用棧。callee屬性在某些時候會非常有用,比如在匿名函數中通過callee來遞歸地調用自身。

var factorial = function (x) {      if (x == 1) {return 1;}      return x * arguments.callee(x-1);  };

第三種用的非遞歸。

        //without Recursion          function fibo3 (argument) {              if(argument <= 1){                  return argument;              }              var fibo = 1;              var fiboPre = 1;              for (var i = 2; i < argument; ++i) {                  var temp = fibo;                  fibo = fibo + fiboPre;                  fiboPre = temp;              }              return fibo;          }          window.console.log(fibo3(10));

第四種也是非遞歸,但是利用了黃金比率1.618,不過要注意的是這種方法在n>69之後,性能就會下降很快,參考文章看這裡:http://www.mathsisfun.com/numbers/fibonacci-sequence.html

        //with gold ratio          function fibo4 (n) {              var sqrt5 = Math.sqrt(5);              var alpha = (1+sqrt5)/2; // 黃金比率:1.618...              return Math.round(Math.pow(alpha,n) / sqrt5); // Please note that this method holds good till n = 69 only.http://www.mathsisfun.com/numbers/fibonacci-sequence.html          }          window.console.log(fibo4(3));