我一直在尝试使用递归在javascript中使用匿名函数查找数字的总和,但是我收到以下错误:
未捕获的SyntaxError:意外的标记+
我想为此使用匿名函数。谁能帮助我找到我在这里做错了什么?
<script type="text/javascript">
console.log(function (n) {
if (n == 0) {
return 1;
}
else {
return function(n+function(n-1));
}
}(8));
</script>
答案 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提供了一种简单的方法来使用铅笔和纸来计算数学:)