`
leeqq
  • 浏览: 137090 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

函数递归

    博客分类:
  • web
阅读更多

以斐波那契数列为例来讲讲递归

 

function fibonacci(n){
    return n < 3 ? 1 : fibonacci(n-1) + fibonacci(n-2);
}
console.log(fibonacci(6));

 上面的定义了函数fibonacci并在内部调用自己形成递归,上面的调用正确输出8

 

 

但是曾经有文章介绍说这样写有问题,就是当在函数外面fibonacci被覆值了怎么办?

 

function fibonacci(n){
    return n < 3 ? 1 : fibonacci(n-1) + fibonacci(n-2);
}
var fun = fibonacci;
fibonacci = 'not a function';
console.log(fun(6));

 这时fun保存着对原有函数的引用可以调用,但是函数内部fibonacci已不是函数

 

Uncaught TypeError: string is not a function

可见函数已经不能正常运行,怎么办,文章里介绍了用arguments.callee来实现递归

arguments.callee表示的是正在执行的函数本身

 

function fibonacci(n){
    return n < 3 ? 1 : arguments.callee(n-1) + arguments.callee(n-2);
}
var fun = fibonacci;
fibonacci = 'not a function';
console.log(fun(6));

 如此在函数内部不再通过fibonacci这个名字来调用,如此不管函数外部怎么把fibonacci改成什么,函数依旧可以正常运行,输出8

 

 

可是这样没问题了么,如果是在严格模式下怎么办,严格模式下,是不让用callee的

 

'use strict'
function fibonacci(n){
    return n < 3 ? 1 : arguments.callee(n-1) + arguments.callee(n-2);
}
var fun = fibonacci;
fibonacci = 'not a function';
console.log(fun(6));

 这里运行结果是

 

Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them

可见callee已经不能用了,那要如何解决呢,今天提供一个方法,如下

 

'use strict'
var fibonacci = function b(n){
    return n < 3 ? 1 : b(n-1) + b(n-2);
}
console.log(fibonacci(6));

 函数正常运行,没有问题

 

即使在函数外部对fibonacci或者b赋值,都不会影响函数的执行

 

'use strict'
var fibonacci = function b(n){
    return n < 3 ? 1 : b(n-1) + b(n-2);
}
var fun = fibonacci;
fibonacci = 'not a function';
console.log(fun(6));

 没有问题,正确输出,这里函数外部是无法直接引用b的,如果在函数外部执行 b='jhgf'; 这样的语句的话结果肯定告诉你 Uncaught ReferenceError: b is not defined

 

当然如果你在函数内部写 var b = '我是来搞破坏的'; 导致函数无法正确运行,那我就无话可说了

 

 

 

分享到:
评论

相关推荐

    函数递归调用堆栈分析.doc

    函数递归调用堆栈分析 函数递归调用堆栈分析是指在计算机科学中,函数递归调用时,函数调用自身的过程中,如何使用堆栈来存储变量和参数的过程。堆栈是一种 lasts-in-first-out(LIFO)的数据结构,用于存储函数...

    C语言函数递归调用学习教案.pptx

    C语言函数递归调用学习教案 C语言函数递归调用是指在调用一个函数的过程中,出现直接或间接地调用该函数本身的现象。递归调用可以用来解决一些复杂的问题,但也需要注意递归调用的深度和性能问题。 函数的递归...

    指针+函数递归的应用(C语言学习)

    指针和函数递归的应用(C语言学习) 在C语言中,指针和函数递归是两个非常重要的概念。 pointer(指针)是一种数据类型,它可以存储内存地址,通过指针可以间接地访问内存中的数据。函数递归是一种编程技术,它允许...

    阿克曼函数递归算法

    接下来,我们将详细分析给定代码片段中的阿克曼函数递归实现方法。首先,我们注意到代码中存在一些错误,例如变量名称中的特殊字符和不正确的逻辑判断。下面是对该代码进行修正后的版本: ```java import java.io....

    ackermann函数的递归实现和非递归实现

    对于其他情况,函数递归地定义为: 3. `A(m, n) = A(m - 1, A(m, n - 1))` 当`m &gt; 0`且`n &gt; 0`。 递归实现的关键在于理解这个过程如何逐层展开。每次调用`A(m, n)`时,如果`m`或`n`不满足基础情况,就会继续调用...

    C or C++函数递归详解

    本文介绍了C语言中函数递归的概念和应用。函数递归是指一个函数在执行过程中调用自身的过程,可以帮助解决一些复杂的问题,如计算阶乘、斐波那契数列等。文章通过实例代码详细讲解了函数递归的实现方式和注意事项,...

    函数递归走迷宫详解及代码

    本文将深入探讨如何使用函数递归解决这类问题,并通过创建迷宫程序来增强理解。递归是计算机科学中一种强大的工具,它允许函数调用自身以解决复杂问题。 首先,我们来理解"走迷宫"的算法。一个迷宫可以被抽象为一个...

    Python:函数递归使用

    在编程领域,函数递归是一种强大的工具,尤其在Python中,它被广泛应用于解决各种问题。函数递归是指一个函数在其定义中调用自身的过程。本篇内容将深入探讨如何利用函数递归来实现汉诺塔游戏、阶乘计算以及科赫曲线...

    c++封装的二叉排序树, c++ 封装 二叉排序树 私有成员函数递归 非递归的插入 实现的树的各种操作。

    c++ 封装 二叉排序树 私有成员函数递归 非递归的插入 实现的树的各种操作,并且利用c++的面向对象思想进行封装,内部包含三个文件BinaryTree.cpp, BinaryTree.hpp , main.cpp

    C语言函数递归调用PPT课件.pptx

    C语言函数递归调用PPT课件 函数的递归调用是指在调用一个函数的过程中,出现直接或间接地调用该函数本身的现象。例如,函数f调用函数f1,函数f1调用函数f2,函数f2调用函数f1,这样就形成了一个递归调用链。 递归...

    自己写的C语言main()函数递归

    刚写完,是一道作业题,想试试主函数递归,所以写了出来,给大家看看,初学C……希望大家指教

    函数递归.sh

    函数递归

    函数递归调用讲解[参照].pdf

    "函数递归调用讲解" 函数递归调用是程序设计中的一种重要概念,它是指一个函数调用自己本身,然后再返回到调用处的过程。函数递归调用是函数调用的一种特殊形式,是指一个函数在自己的定义中调用自己本身,直到达到...

    第36课 - 函数递归与函数设计技巧.rar

    在编程世界中,C语言是一种基础且强大的编程语言,它为开发者提供了丰富的功能,包括函数递归和函数设计。函数是C语言中的基本构建块,它们允许我们将代码组织成可重用的部分,使得程序结构清晰,易于理解和维护。本...

    VB函数递归与调用实用教案.pptx

    标题中的"VB函数递归与调用实用教案"是指一种教学资源,主要讲解了VB(Visual Basic)编程语言中关于函数的递归调用的概念和应用。VB是一种面向对象的编程语言,它允许程序员使用递归函数来解决某些特定问题。 描述...

    Python语言使用函数递归思想绘制圣诞树

    Python语言使用函数递归思想绘制圣诞树,递归算法(recursion algorithm)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。递归式方法可以被用于解决很多的计算机科学问题,因此它是...

    C语言的函数递归探析.pdf

    C语言中的函数递归是一种强大的编程技术,它允许一个函数在执行过程中调用自身来解决问题。这种技术在解决复杂问题时能展现清晰的逻辑结构,尤其是处理那些具有自相似性质的问题时尤为有效。函数递归分为直接递归和...

    C语言函数递归调用PPT学习教案.pptx

    在C语言中,函数递归调用是一种编程技术,它允许一个函数在其定义中调用自身,形成一种自我引用的方式。这种技术在解决特定问题时非常有用,例如处理树形结构、计算阶乘或者实现某些算法。以下是关于C语言函数递归...

    函数递归与调用.pdf

    在编程领域,函数递归与调用是一种强大的技术,尤其在CSP-J 信奥 C++等竞赛编程中,递归常被用来解决复杂的问题。递归是指一个函数直接或间接地调用自身,分为直接递归和间接递归两种形式。 1. 直接递归调用:在...

    使用函数递归实现的计算器(四则运算)

    在编程领域,函数递归是一种强大的技术,它允许函数调用自身来解决问题。在这个场景中,我们讨论的是一个使用函数递归实现的计算器,能够执行基本的四则运算:加法(+)、减法(-)、乘法(*)和除法(/),并支持...

Global site tag (gtag.js) - Google Analytics