[英]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.