【问题标题】:Doing recursion by anonymous function通过匿名函数进行递归
【发布时间】:2015-02-12 22:10:03
【问题描述】:

听到的是我的代码。我需要在不使用函数名的情况下完成这项工作。 虽然函数不能命名,但它们可以作为参数传递给另一个函数。

而且我不想使用arguments.callee。

谁能帮帮我。

其实这是我的任务。我需要在匿名函数中进行递归。而且我不能使用任何函数名。但我可以将函数名作为参数传递给另一个函数。 有什么办法可以替换arguments.callee。

 var n=5; // The result should be 15
  console.log((function sum(n) {
      if (n ==0)
        return n;
      else
        return n + sum(n-1);
    })(n));

【问题讨论】:

  • 给函数命名是正确的做法,你为什么不想给它命名呢?否则,作为练习,请考虑使用 Y 组合器。
  • 如果您能添加一些关于为什么您不想给函数命名的解释,这可能会有所帮助。
  • 其实是我的任务。我需要在匿名函数中进行递归。而且我不能使用任何函数名。但我可以将函数名作为参数传递给另一个函数。

标签: javascript


【解决方案1】:

您可以将代码包装在一个匿名函数中,在其中您可以声明一个命名函数:

console.log((function(n){

  function fib(n) {
    if (n == 0) {
      return n;
    } else {
      return n + fib(n - 1);
    }
  }

  return fib(n);

})(n));

如果你想完全不使用命名函数,只通过将函数作为参数传递给函数设置名称,那么你必须在每次调用中发送函数引用:

console.log((function(f, n){

  return f(f, n);

})(function(f, n) {
  if (n == 0) {
    return n;
  } else {
    return n + f(f, n - 1);
  }
}, n));

【讨论】:

    【解决方案2】:

    您可以使用 U 组合器:

    const U = f => f(f);
    const sum = n => n === 0 ? n : n + sum(n - 1);
    const sum_ = U(h => n => n === 0 ? n : n + h(h)(n - 1));
    
    sum(5); // 15
    sum_(5); // 15
    

    注意必须如何调整传递的 lambda(匿名函数)才能使用 U

         n => n === 0 ? 1 : n + sum (n - 1) // named
    h => n => n === 0 ? 1 : n + h(h)(n - 1) // anonymous
    

    【讨论】:

      【解决方案3】:

      您唯一的其他选择是将函数存储在变量中。

      var fib = function(n) { ... };
      

      您必须以一种或另一种方式引用该函数。如果它不是命名的并且你不使用 arguments.callee 那么你必须将引用存储在一个变量中。

      【讨论】:

      • 有什么新的东西可以取代 arguments.callee.. 因为它已被弃用。
      猜你喜欢
      • 2022-06-20
      • 2015-11-21
      • 2011-01-29
      • 2011-04-22
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      相关资源
      最近更新 更多