Fibonacci Sequences in JavaScript with/without recursive

作者:link

介绍几种使用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));

原文链接:http://ivweb.io/topic/5621116734764b2c1676973a

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏专注 Java 基础分享

为并发而生的 ConcurrentHashMap(Java 8)

HashMap 是我们日常最常见的一种容器,它以键值对的形式完成对数据的存储,但众所周知,它在高并发的情境下是不安全的。尤其是在 jdk 1.8 之前,reha...

69111
来自专栏JavaWeb

Mybatis源码-XXXmapper.xml中的resultMap标签解析过程

1403
来自专栏小狼的世界

JavaScript设计模式学习(四)单件(Singleton Pattern)

单件是JavaScript中最基本、最有用的设计模式,而你今后也会经常的使用这个模式。通过单件,我们可以把统一到一个逻辑单元中并且提供一个唯一的入口,这就保证你...

1084
来自专栏数据小魔方

Julia语言初体验

最近MIT发布的julia 1.0.0版,据传整合了C、Python、R等诸多语言特色,是数据科学领域又一把顶级利器。

1.7K2
来自专栏Spark学习技巧

重要 : 优化flink的四种方式

flink这个框架在逐步变为流处理的主流。本文,我们将针对flink性能调优讲四种不同的方法。

2032
来自专栏北京马哥教育

Python 中被忽略的 else

1354
来自专栏生信小驿站

数据处理第3部分:选择行的基本和高级的方法

原文地址:https://suzan.rbind.io/2018/02/dplyr-tutorial-3/ 作者:Suzan Baert 这是系列dplyr...

781
来自专栏TechBox

一份走心的iOS开发规范前言约定(一)命名规范(二)编码规范2.14 内存管理规范本文参考文章其他有价值的文章

4388
来自专栏fixzd

redis系列:通过通讯录案例学习hash命令

这一篇文章将讲述Redis中的hash类型命令,同样也是通过demo来讲述,其他部分这里就不在赘述了。

831
来自专栏一个会写诗的程序员的博客

《Kotlin 程序设计》第七章 Kotlin 编译过程分析第七章 Kotlin 编译过程分析

http://mp.weixin.qq.com/s/lEFRH523W7aNWUO1QE6ULQ

1282

扫码关注云+社区