首页 web前端 js教程 js中递归函数的使用介绍_javascript技巧

js中递归函数的使用介绍_javascript技巧

May 16, 2016 pm 05:48 PM
递归函数

下面我们就做一个10以内的阶乘试试看吧:


[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
 


递归函数的调用就说这么多了

js递归函数调用自身时的保险方式。
来自js高级程序设计
一个典型阶乘递归函数:
复制代码 代码如下:

function fact(num){
if (numreturn 1;
}else{
return num*fact(num-1);
}
}

以下代码可导致出错:
var anotherFact = fact;
fact = null;
alert(antherFact(4)); //出错

由于fact已经不是函数了,所以出错。
用arguments.callee可解决问题,这是一个指向正在执行的函数的指针。
新的函数为:
复制代码 代码如下:

function fact(num){
if (numreturn 1;
}else{
return num*arguments.callee(num-1); //此处更改了。
}
}
var anotherFact = fact;
fact = null;
alert(antherFact(4)); //结果为24.


JS普通递归的改进

递归函数是在一个函数通过名字调用自身的情况下构成的,如下所示:
复制代码 代码如下:

function factorial(num)
{
if(num{
return 1;
}
else
{
return num * factorial(num-1);
}
}

这是一个经典的阶乘函数。表面看来没有什么问题,但下面的代码却可能导致它出错。
var anotherFactorial = factorial;

anotherFactorial(4); //输出 24
factorial = null;
anotherFactorial (4); //TypeError: Property 'factorial' of object [object Window] is not a function chrome 下测试
原因在于,我们定义的函数名,其实是指向函数的一个指针,此时定义了anotherFactorial 也指向了那个函数,所以调用anotherFactorial (4)可以成功的输出24
此时 factorial = null; 那么执行定义函数的引用就剩下了anotherFactorial,那么在调用anotherFactorial(4)就会显示以上的错误的信息。
此时可以使用arguments.callee来替代函数定义中的 factorial,
函数的定义就变成了:
复制代码 代码如下:

function factorial(num)
{
if(num{
return 1;
}
else
{
return num * arguments.callee(num-1);
}
}

那么在使用上面的4行测试代码,最后一行测试代码也可以成功的输出24.
--------------------------------------
上述的内容摘自>第2版 144页 7.1节
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
2 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

C++ 递归函数的优化技巧有哪些? C++ 递归函数的优化技巧有哪些? Apr 17, 2024 pm 12:24 PM

为了优化递归函数的性能,可以采用以下技巧:使用尾递归:将递归调用放在函数末尾,避免递归开销。备忘录化:存储已计算的结果,避免重复计算。分治法:分解问题,递归解决子问题,提高效率。

如何解决Python的代码中的函数嵌套过多错误? 如何解决Python的代码中的函数嵌套过多错误? Jun 25, 2023 pm 12:35 PM

Python是一门非常强大的编程语言,很多程序员都选择Python作为主要的编程语言。但是,代码中过多的函数嵌套会导致程序难以维护和理解。本文将探讨如何解决Python的代码中的函数嵌套过多错误。函数嵌套浅谈函数嵌套是指在一个函数的主体中定义另外一个函数的过程。函数嵌套可以使程序的结构更加清晰,代码也更易于阅读和维护。但是,函数嵌套过多会导致代码结构过于复杂

C++ 递归函数在搜索算法中的应用? C++ 递归函数在搜索算法中的应用? Apr 17, 2024 pm 04:30 PM

递归函数在搜索算法中用于探索树状数据结构。深度优先搜索使用堆栈探索节点,而广度优先搜索使用队列按层遍历。在实际应用中,如查找文件中,递归函数可用于在指定目录中搜索给定文件。

C++ 递归函数的退出条件是什么? C++ 递归函数的退出条件是什么? Apr 17, 2024 am 11:33 AM

C++递归函数的退出条件包括:基线条件:检查函数是否达到可直接返回结果的状态,通常判断某个条件或参数值是否满足阈值。递归终止条件:替代或补充基线条件,确保函数在一定数量的递归调用后停止,通过跟踪递归深度或设置最大递归深度限制实现。

C++ 递归函数在排序算法中的应用? C++ 递归函数在排序算法中的应用? Apr 17, 2024 am 11:06 AM

C++中递归函数在排序算法中的应用通过递归函数实现的插入排序和归并排序算法,可以将复杂的问题分解为更小的子问题,并通过递归调用高效地解决。插入排序:通过逐个插入元素,将数组有序化。归并排序:分而治之,将数组拆分并递归排序子数组,最后将排序后的子数组合并。

C++ 递归函数的尾递归优化策略如何实现? C++ 递归函数的尾递归优化策略如何实现? Apr 17, 2024 pm 02:42 PM

尾递归优化策略通过将尾递归调用转换为循环,有效减少函数调用栈深度,防止栈溢出。优化策略包括:检测尾递归:检查函数中是否存在尾递归调用。将函数转换为循环:使用循环来代替尾递归调用,并维护栈保存中间状态。

如何使用Go语言递归函数实现阶乘? 如何使用Go语言递归函数实现阶乘? Jul 31, 2023 pm 08:31 PM

如何使用Go语言递归函数实现阶乘?阶乘是数学中常见的一种计算方式,它将一个非负整数n乘以比它小的所有正整数,直到1。例如,5的阶乘可以表示为5!,计算方式为54321=120。在计算机编程中,我们经常使用递归函数来实现阶乘的计算。首先,我们需要了解递归函数的概念。递归函数是指在函数的定义中调用函数本身的过程。在解决问题时,递归函数会不断地

Python编程:递归与匿名函数及函数属性与文档字符串(函数补充) Python编程:递归与匿名函数及函数属性与文档字符串(函数补充) Apr 12, 2023 pm 11:22 PM

本文简单扼要地说,辅以代码进一步地加深理解。 递归函数当函数调用自身而生成最终结果时,这样的函数称为递归。有时递归函数非常有用,因为它们使编写代码变得更容易——使用递归范式编写一些算法非常容易,而其他算法则不是这样。没有不能以迭代方式重写的递归函数,换句话说,所有递归函数都可以通过循环迭代的方式实现,因此通常由程序员根据手头的情况选择最佳方法。递归函数主体通常有两个部分:一部分的返回值依赖于对自身的后续调用,另一部分的返回值不依赖于对自身的后续调用(称基本情况,或递归边界)。作为理解的参考示例,

See all articles