Javascript:关于斐波那契函数中的Return()()格式尾递归
Javascript: About Return()() format tail recursion in Fibonacci function
function fibonacci(n) {
return (function(a, b, i) {
return (i < n) ? arguments.callee(b, a + b, i + 1) : a;
})(1, 1, 1);
}
嘿,我是菜鸟,我能看懂这个函数的数学逻辑部分,我没看懂的是参数传递进度,它把(1,1,1)传递给函数(a b i),这似乎不太正常。
function fibonacci(n) {
return (function(a, b, i) {
return (i < n) ? arguments.callee(b, a + b, i + 1) : a;
})
regular function pass a parameter like the way function(1 1 1)
}
这个我看不懂,我试着把它抽象成最后的
function fibonacci(n){
return()()
}
格式,但这怎么能传递参数,我猜这是关于 return 调用无法处理它之后的函数调用的问题,它也适用于它。
那么,是不是有些基础的东西我没有学呢?喜欢一些默认格式,比如 MDN 中的条目?
非常感谢。
return (function(a, b, i) {
return (i < n) ? arguments.callee(b, a + b, i + 1) : a;
})(1, 1, 1);
是立即调用的匿名函数表达式。括号 are not required.
arguments.callee
的用法已弃用,最好用命名函数表达式编写:
return (function recurse(a, b, i) {
return (i < n) ? recurse(b, a + b, i + 1) : a;
})(1, 1, 1);
相当于函数的声明和调用
function recurse(a, b, i) {
return (i < n) ? recurse(b, a + b, i + 1) : a;
}
return recurse(1, 1, 1);
你最后的抽象是错误的。不是 return()()
但它是:
return ( function(){} )()
请注意,()
不属于 return
,因为 return
不是函数。在这种情况下,()
充当分组括号。以同样的方式使用它:
return (1+1)*2
在这里,在 ()
后面添加 *2
是有效的,因为括号不是函数调用的一部分,而是用作分组运算符。或者更准确地说,表达式计算器。
你看,(1+1)*2
的工作原理是 ()
被识别为不是函数调用的一部分,因此它的内容被视为表达式。所以解析为:
temporary_variable = 1+1;
temporary_variable * 2;
同理,(function(){})()
解析为:
temporary_variable = function(){};
temporary_variable();
因此,整个事情基本上是这样做的:
function f (n) {
temporary_variable = function (a,b,i) {
/* ... */
}
return temporary_variable(1,1,1);
}
function fibonacci(n) {
return (function(a, b, i) {
return (i < n) ? arguments.callee(b, a + b, i + 1) : a;
})(1, 1, 1);
}
嘿,我是菜鸟,我能看懂这个函数的数学逻辑部分,我没看懂的是参数传递进度,它把(1,1,1)传递给函数(a b i),这似乎不太正常。
function fibonacci(n) {
return (function(a, b, i) {
return (i < n) ? arguments.callee(b, a + b, i + 1) : a;
})
regular function pass a parameter like the way function(1 1 1)
}
这个我看不懂,我试着把它抽象成最后的
function fibonacci(n){
return()()
}
格式,但这怎么能传递参数,我猜这是关于 return 调用无法处理它之后的函数调用的问题,它也适用于它。
那么,是不是有些基础的东西我没有学呢?喜欢一些默认格式,比如 MDN 中的条目?
非常感谢。
return (function(a, b, i) { return (i < n) ? arguments.callee(b, a + b, i + 1) : a; })(1, 1, 1);
是立即调用的匿名函数表达式。括号 are not required.
arguments.callee
的用法已弃用,最好用命名函数表达式编写:
return (function recurse(a, b, i) {
return (i < n) ? recurse(b, a + b, i + 1) : a;
})(1, 1, 1);
相当于函数的声明和调用
function recurse(a, b, i) {
return (i < n) ? recurse(b, a + b, i + 1) : a;
}
return recurse(1, 1, 1);
你最后的抽象是错误的。不是 return()()
但它是:
return ( function(){} )()
请注意,()
不属于 return
,因为 return
不是函数。在这种情况下,()
充当分组括号。以同样的方式使用它:
return (1+1)*2
在这里,在 ()
后面添加 *2
是有效的,因为括号不是函数调用的一部分,而是用作分组运算符。或者更准确地说,表达式计算器。
你看,(1+1)*2
的工作原理是 ()
被识别为不是函数调用的一部分,因此它的内容被视为表达式。所以解析为:
temporary_variable = 1+1;
temporary_variable * 2;
同理,(function(){})()
解析为:
temporary_variable = function(){};
temporary_variable();
因此,整个事情基本上是这样做的:
function f (n) {
temporary_variable = function (a,b,i) {
/* ... */
}
return temporary_variable(1,1,1);
}