Fibonacci Sequences in JavaScript with/without recursive

缺乏、安全感 2022-08-06 05:26 63阅读 0赞

第一种、第二种是一样的方法,就是递归:(可优化,应该将每一个元素的值缓存起来,而不是每次递归都计算一次)

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

这里可以说一下JS函数实参对象的callee属性。JS函数的实参对象定义了callee和caller属性。在ES5严格模式中,对这两个属性的读写操作都会产生一个类型错误(TypeError)。而在非严格模式下,ES标准规范规定callee属性指代当前正在执行的函数。caller是非标准的,但大多数浏览器都实现了这个属性,它指代调用当前正在执行的函数的函数。通过caller属性可以访问调用栈。callee属性在某些时候会非常有用,比如在匿名函数中通过callee来递归地调用自身。

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

第三种用的非递归。

  1. //without Recursion
  2. function fibo3 (argument) {
  3. if(argument <= 1){
  4. return argument;
  5. }
  6. var fibo = 1;
  7. var fiboPre = 1;
  8. for (var i = 2; i < argument; ++i) {
  9. var temp = fibo;
  10. fibo = fibo + fiboPre;
  11. fiboPre = temp;
  12. }
  13. return fibo;
  14. }
  15. window.console.log(fibo3(10));

第四种也是非递归,但是利用了黄金比率1.618,不过要注意的是这种方法在n>69之后,性能就会下降很快,参考文章看这里:http://www.mathsisfun.com/numbers/fibonacci-sequence.html

  1. //with gold ratio
  2. function fibo4 (n) {
  3. var sqrt5 = Math.sqrt(5);
  4. var alpha = (1+sqrt5)/2; // 黄金比率:1.618...
  5. 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
  6. }
  7. window.console.log(fibo4(3));

发表评论

表情:
评论列表 (有 0 条评论,63人围观)

还没有评论,来说两句吧...

相关阅读