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)或第二次(下标为1)则直接给予赋值,如果是大于两次,则是之前两项的和。
那么到此为止是不是结束了呢?对于这段代码当中的fn调用,其实可以换为arguments.callee,这个也是利利今天要讲解的内容之一。
Tips:对于此知识的讲解,需要先了解arguments的相关知识,如果你使用的是官网查看,可以点击——>arguments知识讲解查看arguments的详细讲解。如果你是通过我们的微信号查看的,可以通过发送arguments,查看关于arguments的基础知识。
callee属性的初始值就是正被执行的 Function 对象,表示对函数对象本身的引用。有利于匿名函数的递归或者保证函数的封装性。
该属性仅当相关函数正在执行时才可用。
callee拥有length属性,arguments.length是实参长度,arguments.callee.length是形参长度,由此可以判断调用时形参长度是否和实参长度一致。
callee最广泛的用途就是在匿名函数里递归调用自身,但 ECMAScript 3 已允许有名字的函数表达式,且不会污染命名空间,所以在实现同样的功能时并不会变得不优雅。
arguments 是个很大的对象,每次递归调用时都需要重新创建(虽然 arguments.callee 是不变的,但是 arguments.caller 是不一样的,调用的参数也不一样的)。ECMAScript5的标准中Strict Mode禁止使用。
如上的代码也可以书写成这样:
扩展讲解一下caller这个东西吧
functionName 对象是所执行函数的名称。
如果函数是由顶层调用的,那么 caller包含的就是 null 。如果在字符串上下文中使用 caller属性,那么结果和 functionName.toString 一样,也就是说,显示的是函数的反编译文本。
最后,作为科学普及,我们扯扯生活中的“斐波那契数列”。
随着数列项数的增加,前一项与后一项之比越来越逼近黄金分割的数值0.6180339887
松果、凤梨、树叶的排列、某些花朵的花瓣数(典型的有向日葵花瓣),蜂巢,蜻蜓翅膀。
譬如:百合花花瓣数目为3,梅花5瓣,飞燕草8瓣,万寿菊13瓣,向日葵21或34瓣,雏菊有34,55和89三个数目的花瓣。
HTML5小编-利利 耗时2.5h
欢迎沟通交流~HTML5学堂