递归是一种常见的编程技巧,实名递归相信大家都不陌生,但如果想要实现匿名递归呢?比如想要返回一个匿名递归函数,又或者是定义一个匿名递归函数并直接调用它,该怎样去做呢?本文将来探讨一下它的实现。
实名递归
我们还是先从实名递归说起吧,还是用那个最简单的求阶乘的例子:
function fact(n) { if (n < 2) { return n; } else { return n * fact(n - 1); } } console.log(fact(5));
递归要求自己调用自己,如果函数有名字,这就太简单不过了。
利用变量实现递归
函数还可以赋给一个变量,不过要实现递归,函数体里面还是要依赖这个变量名:
var f = function(n) { if (n < 2) { return n; } else { return n * f(n - 1); } } console.log(f(5));
应该说这种方式跟之前的其实没有本质的不同。
匿名递归
现在我们来探讨匿名递归的实现。
初步设想
如果想要返回一个匿名递归函数,又或者是定义一个匿名递归函数并直接调用它:
(function (n) { if (n < 2) { return n; } else { return n * ?(n - 1); } })(5);
如果没有一个名字,代码中那个问号我们就不知道要填写什么,就没法形成递归了,此时我们要怎么办呢?这时就要请出 arguments 对象了。
arguments 对象
在 javascript 的函数中,arguments 对象代表了实际调用时的参数对象。在我们的递归函数中,实际上我们也可以完全不用去定义“形式参数” n:
function factNoParam() { if (arguments[0] < 2) { return arguments[0]; } else { return arguments[0] * factNoParam(arguments[0] - 1); } } console.log(factNoParam(5));
只要我们在调用时传入了实际的参数,就可以用 arguments[0] 取得实际传入的这个参数的值。
如果有更多的参数,还可以 arguments[1],arguments[2] 等来取得。
arguments.callee 属性
arguments 可以用来获取参数,相信你可能已经知道了,但 arguments 对象其实还有一个属性,即所谓的 callee。arguments.callee 代表了这个函数本身。这是什么意思呢?其实我们完全可以把 fact 写成这样:
function fact(n) { if (n < 2) { return n; } else { return n * arguments.callee(n - 1); } } console.log(fact(5));
那么它依然是递归的。因为 arguments.callee 实际就等于 fact。
那么,到了这里,有了这个属性的帮助,要实现匿名递归就不难了,只要把 ? 改为 arguments.callee 即可:
(function (n) { if (n < 2) { return n; } else { return n * arguments.callee(n - 1); } })(5);
如果有需要,也可以把它作为匿名递归返回。
关于 javascript 实现匿名递归的介绍就到这里。希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍C++递归实现螺旋数组的实例代码,包括了C++递归实现螺旋数组的实例代码的使用技巧和注意事项,需要的朋友参考一下 仅供参考,若有可改进之处,欢迎一起交流! 调试 7 8 1 2 3 4 5 6 7 8 26 27 28 29 30 31 32 9 25 44 45 46 47 48 33 10 24 43 54 55 56 49 34 11 23 42 53 52 51 50 35
本文向大家介绍Go递归修改文件名的实例代码,包括了Go递归修改文件名的实例代码的使用技巧和注意事项,需要的朋友参考一下 在生活中我们往往有这样的需求,就是从网上找的文件资源经常包含了一些无用信息,而且在它的子目录下也同样存在,如果我们手动一个个的修改的话会特别麻烦,也特别耗时,我们可以考虑把这件事交给计算机来做。 如下图,我的桌面有一个名为dir【我爱你】的目录,而且这个目录下的子目录和文件都包含
本文向大家介绍JavaScript中匿名函数的递归调用,包括了JavaScript中匿名函数的递归调用的使用技巧和注意事项,需要的朋友参考一下 不管是什么编程语言,相信稍微写过几行代码的同学,对递归都不会陌生。 以一个简单的阶乘计算为例: 我们可以看出,递归就是在函数内部调用对自身的调用。 那么问题来了,我们知道在Javascript中,有一类函数叫做匿名函数,没有名称,怎么调用呢?当然你可以说,
本文向大家介绍JavaScript递归操作实例浅析,包括了JavaScript递归操作实例浅析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了JavaScript递归操作。分享给大家供大家参考,具体如下: 问题 一个简单的递归,求n的阶乘: 如果像下面这样使用它,则会出错: 因为fcopy指向的函数实体调用了factorial,而factorial已经被释放。 解决的办法 使用argume
问题内容: 是否可以具有递归和匿名的PHP函数?这是我尝试使其工作,但未传入函数名称。 我还知道这是实现阶乘的一种不好方法,这只是一个例子。 问题答案: 为了使其正常工作,您需要传递$ factorial作为参考
本文向大家介绍一个JavaScript递归实现反转数组字符串的实例,包括了一个JavaScript递归实现反转数组字符串的实例的使用技巧和注意事项,需要的朋友参考一下