Javascript 实现匿名递归

来源:互联网 发布:淘宝客户管理 编辑:程序博客网 时间:2024/06/03 19:26
递归是一种常见的编程技巧,实名递归相信大家都不陌生,但如果想要实现匿名递归呢?比如想要返回一个匿名递归函数,又或者是定义一个匿名递归函数并直接调用它,该怎样去做呢?本文将来和大家一起来探讨下使用javascript来实现它,一起来看看吧,希望对大家学习javascript有所帮助。
  实名递归
  我们还是先从实名递归说起吧,还是用那个最简单的求阶乘的例子:
  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);
  如果有需要,也可以把它作为匿名递归返回。

来源:网络
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 透明塑料磨花了怎么办 包包金属刮花了怎么办 鞋子刮了黑印子怎么办 黑色鞋跟磨白了怎么办 脚穿鞋子磨起泡怎么办 脚被鞋子磨红了怎么办 脚被鞋子磨黑了怎么办 白鞋皮鞋磨了皮怎么办 小脚趾磨肿了怎么办 穿鞋小拇指磨脚怎么办 高铁东西忘了怎么办 人故意去撞车死了怎么办? 新货车上户超重怎么办 车险出保单车号填错怎么办 货车拦板变形了怎么办 行车监控看不清楚车号怎么办? 1.5米的鱼缸要怎么办 被锤子砸到手了怎么办 家里地下污水管道堵塞怎么办 家里pvc灯罩变黄怎么办 欧普吸顶灯灯罩坏了怎么办 硬盘用久了变慢怎么办 地税申报工资人员弄错怎么办 买保险保单丢了怎么办 买保险的银行卡丢了怎么办 没学过JAVA入职怎么办 磨砂皮擦了鞋油怎么办 磨破皮伤口有沙子怎么办 工行信用卡被风险锁定了怎么办 超重被超限站查住以后怎么办 银行卡输入密码次数超限怎么办 信用卡密码错误次数超限怎么办 农行密码错误次数超限怎么办 剪力墙偏心受拉怎么办 韵达快递寄丢了怎么办 重要快递送丢了怎么办 快递员送货丢了怎么办 买的快递丢失了怎么办 申通把件弄丢了怎么办 淘宝快递送丢了怎么办 我的快递丢了怎么办