专栏首页HTML5学堂斐波那契数列与arguments.callee

斐波那契数列与arguments.callee

HTML5学堂:提到斐波那契数列,很多人还不是太清楚,但是如果提到兔子繁殖这个经典题目,相信学过计算机语言的人们会立刻感觉“亲切”起来,今天我们就来说说斐波那契数列,也讲一讲里面用到的arguments.callee。

斐波那契数列

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368

特别指出:第0项是0,第1项是第一个1。

这个数列从第2项开始,每一项都等于前两项之和。

兔子繁殖问题

斐波那契数列又因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”。

题目为:兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?

我们不妨拿新出生的一对小兔子分析一下:

两个月后,生下一对小兔对数共有两对

三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对

……………………

关于斐波那契数列的JS代码实现

基本思路:判断当前是第几次,如果是第一次(下标为0)或第二次(下标为1)则直接给予赋值,如果是大于两次,则是之前两项的和。

var result = [];
function fn(n) { // 典型的斐波那契数列 - 版权归属:HTML5学堂
    if (n == 0) {
        return 0;
    } else if (n == 1) {
        return 1;
    } else {
        if (result[n]) {
            return result[n];
        } else {
            result[n] = fn(n - 1) + fn(n - 2);
            return result[n];
        }
    }
}

那么到此为止是不是结束了呢?对于这段代码当中的fn调用,其实可以换为arguments.callee,这个也是利利今天要讲解的内容之一。

arguments.callee

Tips:对于此知识的讲解,需要先了解arguments的相关知识,如果你使用的是官网查看,可以查看——>arguments知识讲解查看arguments的详细讲解。如果你是通过我们的微信号查看的,可以通过发送arguments,查看关于arguments的基础知识。

callee属性的初始值就是正被执行的 Function 对象,表示对函数对象本身的引用。有利于匿名函数的递归或者保证函数的封装性。

该属性仅当相关函数正在执行时才可用。

callee拥有length属性,arguments.length是实参长度,arguments.callee.length是形参长度,由此可以判断调用时形参长度是否和实参长度一致。

arguments.callee并不是很推荐使用

callee最广泛的用途就是在匿名函数里递归调用自身,但 ECMAScript 3 已允许有名字的函数表达式,且不会污染命名空间,所以在实现同样的功能时并不会变得不优雅。

arguments 是个很大的对象,每次递归调用时都需要重新创建(虽然 arguments.callee 是不变的,但是 arguments.caller 是不一样的,调用的参数也不一样的)。ECMAScript5的标准中Strict Mode禁止使用。

如上的代码也可以书写成这样:

var result = [];
function fn(n) { // 典型的斐波那契数列 - 版权归属:HTML5学堂
    if (n == 0) {
        return 0;
    } else if (n == 1) {
        return 1;
    } else {
        if (result[n]) {
            return result[n];
        } else {
            result[n] = arguments.callee(n - 1) + arguments.callee(n - 2);
            return result[n];
        }
    }
}

functionName.caller

扩展讲解一下caller这个东西吧

functionName 对象是所执行函数的名称。

如果函数是由顶层调用的,那么 caller包含的就是 null 。如果在字符串上下文中使用 caller属性,那么结果和 functionName.toString 一样,也就是说,显示的是函数的反编译文本。

function h5course(num1) {
    console.log(h5course.caller); // null
}
h5course(2, 3);
h5course.toString(); // 返回字符串,内容为这个函数

生活当中的斐波那契数列

最后,作为科学普及,我们扯扯生活中的“斐波那契数列”。

黄金分割

随着数列项数的增加,前一项与后一项之比越来越逼近黄金分割的数值0.6180339887

自然界花朵的花瓣

松果、凤梨、树叶的排列、某些花朵的花瓣数(典型的有向日葵花瓣),蜂巢,蜻蜓翅膀。

譬如:百合花花瓣数目为3,梅花5瓣,飞燕草8瓣,万寿菊13瓣,向日葵21或34瓣,雏菊有34,55和89三个数目的花瓣。

HTML5小编-利利 耗时2.5h

本文分享自微信公众号 - HTML5学堂(h5course-com),作者:HTML5学堂

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-04-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 2015.11.30 HTML5真题练习

    HTML5学堂:每天一道题,强壮程序员!今日主要涉及昨日题目的解答,以及一道涉及函数的形参实参、arguments对象的题目 HTML5真题【2015.11.2...

    HTML5学堂
  • 揭开身份证验证的神秘面纱

    正则验证身份证号码 HTML5学堂:曾经一直觉得用正则验证身份证号码是很简单的~但是,当真正挖掘身份证号码的规则之后,才发现,想要写好一个正则验证也没有那么容易...

    HTML5学堂
  • 2015.11.29 HTML5真题练习

    HTML5学堂:每天一道题,强壮程序员!今日的HTML5题目,主要涉及到JavaScript中的函数、函数返回值和作用域的相关知识。一起来看题目吧~! HTML...

    HTML5学堂
  • Python数据处理从零开始----第四章(可视化)(8)火山图目录

    来源数据分别是差异基因分析的两列指标,FoldChange和Pvalue值,根据这两个指标,我们可以把基因分为up,down和normal三种差异表达类型,...

    用户1359560
  • python中的__repr__ 方法

    输出实例化的Person类,返回的是一个在内存中的对象,事实上,当输出person实例对象时,实际上输出的是person对象上__repr__方法的返回值,也就...

    于小勇
  • 命令行界面(CLI)消亡史

    IT行业正在向所有的一切都采用应用程序编程接口(API)演进,这使得企业能够自动执行重复性任务,提高效率并减少错误的系统。但是,这引出了新的问题:在IT系统中A...

    SDNLAB
  • python学习之对象的三大特性

    在面向对象程序设计中,对象可以看做是数据(特性)以及由一系列可以存取、操作这些数据的方法所组成的集合。编写代码时,我们可以将所有功能都写在一个文件里,这样也是可...

    py3study
  • Fiori UI上创建的note和web client UI上note的对应关系

    Sent: Thursday, December 11, 2014 5:28 PM

    Jerry Wang
  • 使用机器人操作系统ROS 2和仿真软件Gazebo 9环境综合测试教程(三)

    在完成教程(一)搭建机器人和(二)命令遥控可视化后,将仿真机器人用于更为逼真的环境,可以测试如SLAM,区域覆盖以及场馆巡逻算法,这里环境均采用aws提供模型,...

    zhangrelay
  • 24. 企业级开发基础5:面向对象特征(封装)

    在我们程序开发过程中,定义好类型之后就可以通过类型来创建对象 如:我们定义一个中华人民共和国公民的类型

    大牧莫邪

扫码关注云+社区

领取腾讯云代金券