簡體   English   中英

Javascript:關於Fibonacci函數中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)傳遞給了函數(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中的條目?

非常感謝。

 return (function(a, b, i) { return (i < n) ? arguments.callee(b, a + b, i + 1) : a; })(1, 1, 1); 

是立即被調用的匿名函數表達式。 不需要用括號括起來。

不推薦使用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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM