通过匿名函数进行递归

时间:2014-12-14 20:01:15

标签: javascript

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

我不想使用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));

3 个答案:

答案 0 :(得分:3)

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

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));

答案 1 :(得分:1)

您可以使用U-combinator:

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

注意为了使用U,必须如何调整传递的lambda(匿名函数):

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

答案 2 :(得分:0)

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

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

您必须以某种方式引用该功能。如果它不是命名的并且您不使用arguments.callee,那么您必须将引用存储在变量中。