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 条评论
登录 后参与评论

相关文章

来自专栏calmound

D3DXCreateTextureFromFile

HRESULT D3DXCreateTextureFromFile( __in LPDIRECT3DDEVICE9 pDevice, _...

2725
来自专栏算法channel

记录贴 2 | Python删除List内元素的坑和原因深度分析

感谢粉丝:秋日私语,在 原创互助答疑群2 内,秋日私语遇到的一个list删除操作的问题,这是一个非常经典的坑。群内小伙伴:@数据科学-苏,@机器学习-guo等给...

780
来自专栏小灰灰

Java 动手写爬虫: 三、爬取队列

第三篇 爬取队列的实现 第二篇中,实现了深度爬取的过程,但其中一个比较明显的问题就是没有实现每个爬取作为一个独立的任务来执行;即串行的爬取网页中的链接;因此,...

2625
来自专栏Fundebug

JavaScript中的变量提升(Hoisting)

为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。

1276
来自专栏阿杜的世界

JVM阅读心得0713

593
来自专栏GreenLeaves

EF基础知识小记六(使用Code First建模自引用关系,常用于系统菜单、文件目录等有层级之分的实体)

日常开发中,经常会碰到一些自引用的实体,比如系统菜单、目录实体,这类实体往往自己引用自己,所以我们必须学会使用Code First来建立这一类的模型. 以下是自...

1926
来自专栏丑胖侠

《Drools7.0.0.Final规则引擎教程》第4章 global全局变量

global 全局变量 global用来定义全局变量,它可以让应用程序的对象在规则文件中能够被访问。通常,可以用来为规则文件提供数据或服务。特别是用来操作规则执...

2426
来自专栏安恒网络空间安全讲武堂

hacklu CTF 2018 Baby PHP

过file_get_contents()用到了php伪协议。https://www.lorexxar.cn/2016/09/14/php-wei/。只要通过ph...

1002
来自专栏前端侠2.0

oracle 两表关联时,年月条件的写法引起的巨大性能的差异

需求是要比较最近两个月的值,进行数据检验!所以我用自关联,来将两个月的数据放到一行上,然后进行比较!

822
来自专栏菩提树下的杨过

as3: this,stage,root的测试

在不使用文档类(document class)的情况下,直接在时间轴上写以下代码: trace("this->" + this,",root->" + root...

1986

扫码关注云+社区