Javascript实现匿名递归的实例代码

  

递归是一种常见的编程技巧,实名递归相信大家都不陌生,但如果想要实现匿名递归呢?比如想要返回一个匿名递归函数,又或者是定义一个匿名递归函数并直接调用它,该怎样去做呢?本文将来探讨一下它的实现。

  

<>强实名递归

  

我们还是先从实名递归说起吧,还是用那个最简单的求阶乘的例子:

        函数的事实(n) {   如果(n & lt;2){   返回n;   其他}{   返回n (n - 1) *事实;   }   }   console.log(事实(5));      

递归要求自己调用自己,如果函数有名字,这就太简单不过了。

  

<>强利用变量实现递归

  

函数还可以赋给一个变量,不过要实现递归,函数体里面还是要依赖这个变量名:

        var f=函数(n) {   如果(n & lt;2){   返回n;   其他}{   返回n * f (n - 1);   }   }   console.log (f (5));      

应该说这种方式跟之前的其实没有本质的不同。

  

<强>匿名递归

  

现在我们来探讨匿名递归的实现。

  

<强>初步设想

  

如果想要返回一个匿名递归函数,又或者是定义一个匿名递归函数并直接调用它:

        (函数(n) {   如果(n & lt;2){   返回n;   其他}{   返回n * & # 63; (n - 1);   }   })(5);   之前      

如果没有一个名字,代码中那个问号我们就不知道要填写什么,就没法形成递归了,此时我们要怎么办呢?这时就要请出参数对象了。

  

<强>参数对象

  

在javascript的函数中,参数对象代表了实际调用时的参数对象。在我们的递归函数中,实际上我们也可以完全不用去定义”形式参数“n:

        函数factNoParam () {   如果(参数[0]& lt;2){   返回参数[0];   其他}{   返回参数[0]* factNoParam[0] - 1(参数);   }   }   console.log (factNoParam (5));      

只要我们在调用时传入了实际的参数,就可以用参数[0]取得实际传入的这个参数的值。

  

如果有更多的参数,还可以参数[1],[2]等参数来取得。
  

  

<强>参数。被属性

  

参数可以用来获取参数,相信你可能已经知道了,但参数对象其实还有一个属性,即所谓的callee.arguments。被代表了这个函数本身。这是什么意思呢?其实我们完全可以把事实写成这样:

        函数的事实(n) {   如果(n & lt;2){   返回n;   其他}{   返回n *参数。被(n - 1);   }   }   console.log(事实(5));      

那么它依然是递归的。因为参数。被实际就等于事实。

  

那么,到了这里,有了这个属性的帮助,要实现匿名递归就不难了,只要把& # 63;改为参数。被即可:

        (函数(n) {   如果(n & lt;2){   返回n;   其他}{   返回n *参数。被(n - 1);   }   })(5),      

如果有需要,也可以把它作为匿名递归返回。

  

关于javascript实现匿名递归的介绍就到这里。希望对大家的学习有所帮助,也希望大家多多支持。

Javascript实现匿名递归的实例代码