Javascript匿名函数错误

时间:2014-12-03 07:07:30

标签: javascript recursion anonymous-function

我一直在尝试使用递归在javascript中使用匿名函数查找数字的总和,但是我收到以下错误:

  

未捕获的SyntaxError:意外的标记+

我想为此使用匿名函数。谁能帮助我找到我在这里做错了什么?

<script type="text/javascript">
    console.log(function (n) {
        if (n == 0) {
            return 1;
        }
        else {
            return function(n+function(n-1));
        }
    }(8));
</script>

3 个答案:

答案 0 :(得分:4)

您正在做的事情有几个问题。

对于初学者来说,尝试递归调用函数(function(n+function(n-1)))将导致调用堆栈大小超出错误,因为您要将总和添加到传递给递归调用的每个参数。你可能想要更接近(n + function(n-1))的东西。

但是,这仍然存在问题,因为您无法递归调用匿名函数(除非使用arguments.callee,严格模式下不允许这样做。)

为了做你看起来没有给你的函数表达式命名的尝试,你可以做类似的事情:

console.log(function(n) {
    if (n == 0) {
        return 1;
    }
    else {
        return n + arguments.callee(n-1);
    }
}(8))

但是,您也可以为函数表达式提供一个名称,以便在递归调用中引用,这也将在严格模式下工作:

console.log(function foo(n) {
    if (n == 0) {
        return 1;
    }
    else {
        return n + foo(n-1);
    }
}(8))

编辑:在基本情况下(n == 0)你可能想要返回0而不是1,如果你的目标是得到从0到n的所有整数之和。

答案 1 :(得分:3)

  console.log(function fn(n) {
      if (n == 0) {
          return 1;
      } else {
          return (n + fn(n - 1));
      }
  }(8));

此行函数出错(n + function(n-1)),因为这是语法错误,你不能像你那样调用函数。在我们的例子中,你应该添加自调用函数 - 名称,并将其用于递归调用堆栈

答案 2 :(得分:0)

当我修改匿名函数以使用正确的递归,即return n + f(n-1)时,我发现奇怪的是,只要脚本驻留在HTML页面上,以下代码就可以在不诉诸arguments.callee的情况下工作。注意:它仍然不能与console.log一起使用。

还有一件事,如果这个例子中的代码试图得到从8到1的数字之和,那么当n等于0时,返回值应该为零,而不是一个数值在数学上是正确的。

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

var res = f(8); // 36

查看http://jsfiddle.net/d5k4ag8w/11/的实时示例 此外,这个article提供了一种简单的方法来使用铅笔和纸来计算数学:)