斐波那契数列与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)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏阿凯的Excel

文本数字拆分技巧

Excel处理人员呢,最喜欢的就是规范化的表,那什么样子的表是规范的呢?给大家个图片感受一下! ? 今天的要和大家分享的就是和规范化图表格格不入的,需要由不规...

2736
来自专栏技术小黑屋

研究学习Kotlin的一些方法

Kotlin是一门让人感到很舒服的语言,相比Java来说,它更加简洁,省去了琐琐碎碎的语法工作,同时了提供了类似Lambda,String template,N...

651
来自专栏ml

初学java之接口基础

1 /* 2 长城牌电视机 3 联想奔月5008PC机 4 */ 5 6 7 package st; 8 //接口回调实例 9 in...

2936
来自专栏Java技术栈

Spring Boot 2.x 启动全过程源码分析(上)入口类剖析

Spring Boot 的应用教程我们已经分享过很多了,今天来通过源码来分析下它的启动过程,探究下 Spring Boot 为什么这么简便的奥秘。

760
来自专栏HTML5学堂

2000! | 看上去如此简单的面试题,让太多“前端”英雄好汉折戟

HTML5学堂-码匠:求某个数字的阶乘,很难吗?看上去这道题异常简单,却不曾想里面暗藏杀机,让不少前端面试的英雄好汉折戟沉沙。 面试真题题目 如何求“大数”的阶...

3466
来自专栏算法修养

pta习题集5-16 朋友圈

某学校有N个学生,形成M个俱乐部。每个俱乐部里的学生有着一定相似的兴趣爱好,形成一个朋友圈。一个学生可以同时属于若干个不同的俱乐部。根据“我的朋友的朋友也是我...

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

3002 石子归并 3

 时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果 题目描述 Description 有n堆石子...

3237
来自专栏尾尾部落

[剑指offer] 孩子们的游戏(圆圈中最后剩下的数) [剑指offer] 孩子们的游戏(圆圈中最后剩下的数)

每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友...

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

BZOJ2434: [Noi2011]阿狸的打字机(AC自动机 树状数组)

1003
来自专栏小樱的经验随笔

数论部分第二节:埃拉托斯特尼筛法 埃拉托斯特尼筛法

埃拉托斯特尼筛法 质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。怎么判断n以内的哪些数是质数呢? 埃拉托斯特尼筛法 厄...

2577

扫码关注云+社区