用JavaScirpt实现斐波纳契数列最简洁方式

本文详细介绍了斐波纳契数列的基本概念及其递归实现方式,通过优化代码减少条件判断,确保输入合法。同时,讨论了在不同JavaScript环境中递归函数可能遇到的问题及解决方案,特别提到了严格模式下arguments.callee的限制,并提供了替代方案。文章还对比了函数表达式、命名函数表达式和传统函数声明在实现斐波纳契数列时的差异,旨在为开发者提供全面的实践指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

斐波纳契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1960年代起出版了《斐波纳契数列》季刊,专门刊载这方面的研究成果。

                                    ---以上信息来自百度百科。

网上看了N多,如用if else 、switch case等方式,用三目运算是最简洁的:

 var fib = function(n){

            return n < 2 ? n:(fib(n-1)+fib(n-2));//写更简洁的代码
        };
        console.log(fib(9));

简洁不错的(网上要求是不运用条件判断语句实现最简洁版本,但无法完成校验),以上实现疏忽两点:非Number类型、非正整值。

完整实现:(使用了条件判断语句,使用正则校验)

  //采用三目运算解决 fib函数问题
        var fib = function(n){
            //是否是正整数
            if(!/^[0-9]*[1-9][0-9]*$/.exec(n)) return null;
            return n < 2 ? n:(fib(n-1)+fib(n-2));
        };
      
        console.log(fib('a'));//null;
        console.log(fib(0));//null
        console.log(fib(6));//8

有其他写法没?求解~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                                                                                         经:http://labs.codecademy.com/#:workspace 验证通过微笑


---------------------------------10月29日更改:

本来想将上述例子更改为:

   var fib(n){

    //..

    return n<2?arguments.callee(n-1)+arguments.callee(n-2);

 }

这样做的目的是放置函数名称变更引发的错误。但今天看到以下博文:http://www.cnblogs.com/TomXu/archive/2011/12/29/2290308.html(摘自部分)

将来的ECMAScript-262第5版(目前还是草案)会引入所谓的严格模式(strict mode)。开启严格模式的实现会禁用语言中的那些不稳定、不可靠和不安全的特性。据说出于安全方面的考虑,arguments.callee属性将在严格模式下被“封杀”。因此,在处于严格模式时,访问arguments.callee会导致TypeError(参见ECMA-262第5版的10.6节)。而我之所以在此提到严格模式,是因为如果在基于第5版标准的实现中无法使用arguments.callee来执行递归操作,那么使用命名函数表达式的可能性就会大大增加。从这个意义上来说,理解命名函数表达式的语义及其bug也就显得更加重要了。

  // 此前,你可能会使用arguments.callee
  (function(x) {
    if (x <= 1) return 1;
    return x * arguments.callee(x - 1);
  })(10);
  
  // 但在严格模式下,有可能就要使用命名函数表达式
  (function factorial(x) {
    if (x <= 1) return 1;
    return x * factorial(x - 1);
  })(10);
  
  // 要么就退一步,使用没有那么灵活的函数声明
  function factorial(x) {
    if (x <= 1) return 1;
    return x * factorial(x - 1);
  }
  factorial(10);
所以貌似这种写法就~~。

另有关公有私有保护方法命名规范一事,今晚写。 地址是:http://blog.youkuaiyun.com/xiaohan1990718/article/details/8120161 在分割线下面。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值