Javascript:关于Fibonacci函数中的Return()()格式尾递归

时间:2015-04-16 00:14:06

标签: javascript return tail-recursion

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)到函数(abi),这似乎不太正常。

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()()
}

格式,但是这怎么能传递参数,我想这是关于返回调用无法处理函数调用之后的事情,它也适用于它。

那么,我还没有学到一些基本的东西吗?像某些默认格式,如MDN中的条目?

Thnx很多。

2 个答案:

答案 0 :(得分:1)

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

答案 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);
}