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

相关文章

来自专栏数据结构与算法

洛谷U16574 attack的斐波那契

题目背景 attack很喜欢斐波那契数列 题目描述 设f[i]表示斐波那契数论的第i项 f[1]=1 ,f[2] =2 给定一个n 求 输入输出格式 输入...

2565
来自专栏有趣的Python

11-玩转数据结构-并查集

前面我们接触的树结构都是由父亲指向孩子,但是我们的并查集却是由孩子指向父亲。这种奇怪的树结构可以非常高效的回答一类问题: 连接问题 Connectivity P...

812
来自专栏章鱼的慢慢技术路

斐波那契数列题型汇总

1286
来自专栏数据结构与算法

1545 最简单排序

个人博客:double.win 1545 最简单排序  时间限制: 1 s  空间限制: 1000 KB  题目等级 : 青铜 Bronze 题解 题目描述 D...

2536
来自专栏从流域到海域

《笨办法学Python》 第5课手记

《笨办法学Python》 第5课手记 本节内容复习了前两节的内容,并且引入了格式化字符,这节课里的格式化字符与C语言格式化字符,规则没有什么区别。 我把原文代码...

2029
来自专栏Ldpe2G的个人博客

MXNet Scala 学习笔记 二 ---- 创建新的 Operator

882
来自专栏Ldpe2G的个人博客

MXNet Scala 学习笔记 二 ---- 创建新的 Operator

(比如Python、Scala)采用现有的操作子来组合,比如实现 Selu 激活函数。

992
来自专栏HTML5学堂

为什么不要在 JavaScript 中使用位操作符?

如果你的第一门编程语言不是 JavaScript,而是 C++ 或 Java,那么一开始你大概会看不惯 JavaScript 的数字类型。在 JavaScrip...

34610
来自专栏老九学堂

干货| 期末临近快捷C语言复习

? 盼望着盼望着,寒假近了 当然期末考试也就近了 C 语言,晦涩难懂 对于很多同学来说又是初次接触… 期末考试怎么办 不要担心!老九又出新篇章啦 总结了排序...

3607
来自专栏海天一树

按出现次数从少到多的顺序输出数组中的字符串

问题 有一个数组为{"Liu Yi", "Chen Er", "Zhang San", "Chen Er", "Chen Er", "Li Si", "Li S...

2596

扫码关注云+社区