> Currying 柯里化:「將一個接受 n 個參數的 function,轉變成 n 個只接受一個參數的 function」的過程 ### 柯里化的好處是 1. 簡化參數的處理,基本上是一次處理一個參數,藉以提高程式的彈性和可讀性 2. 將程式碼依功能拆解成更細的片段,有助於重複利用 ### Curry example #1 假設有個 function,傳入被乘數和乘數之後可以得到兩數相乘的結果 ```javascript= function multyply(x,y){ return x*y } multyply(3,5);//15 ``` 柯里化就變這樣 :arrow_heading_down: ```javascript= function curried(x) { return function(y) { return x * y; } } ``` 我想將被乘數固定為5,再分別傳入3和5就可以得到不同的答案 ```javascript= const curried5 = curried(5) console.log( curried5(3)) console.log( curried5(5)) ``` ### example #2 ```javascript= const greet=(text,name)=>{ console.log(`${text},${name}`) } greet("HI","BOB") ``` 接著我們可以將 greeting 和 name 兩個參數拆開,就像把 greeting 提出來,接下來只要傳入 name就好 ```javascript= const curriedGreet=(greeting)=>{ return function(name){ consoel.log(`${greeting},${name}`) } } const hi = curriedGreet("HI") const yo = curriedGreet("YO") hi("Joy")//HI,Joy yo("Joy")//YO,Joy ``` 再回到這一題 ```javascript= /** * function sum(a, b) { return a + b; } * const csum = curry(sum); * csum(1)(2) // 3 */ ``` 因為一次只傳入一個()內的參數,參數有可能足夠或不足夠 ```javascript= function curry(fn) { return function curried(...args) { if(fn.length===args.length){ //足夠,...args= 1 2 return fn(...args) }else{ return function (...nextArgs){ //不足夠,args= 1 nextArgs= 2 return curried(...args,...nextArgs) } } }; }; ``` 一開始會直接進入第六行,因為第一次只傳入了1這個參數所以不足夠,接著我們拿到了 nextArgs 所以再呼叫一次 curried 並把足夠的參數傳進去 ###### tags:`Function` | `leetCode` <font color="#FBC01E" background="E1F3F0">`medium`</font> ### 題目 Given a function fn, return a curried version of that function. A curried function is a function that accepts fewer or an equal number of parameters as the original function and returns either another curried function or the same value the original function would have returned. In practical terms, if you called the original function like sum(1,2,3), you would call the curried version like csum(1)(2)(3), csum(1)(2,3), csum(1,2)(3), or csum(1,2,3). All these methods of calling the curried function should return the same value as the original. ### Example ```javascript= Input: fn = function sum(a, b, c) { return a + b + c; } inputs = [[1],[2],[3]] Output: 6 Explanation: The code being executed is: const curriedSum = curry(fn); curriedSum(1)(2)(3) === 6; curriedSum(1)(2)(3) should return the same value as sum(1, 2, 3). ``` ```javascript= Input: fn = function sum(a, b, c) { return a + b + c; } inputs = [[1,2],[3]] Output: 6 Explanation: curriedSum(1, 2)(3) should return the same value as sum(1, 2, 3). ``` --- ### 解題邏輯 這兩天的 medium 真的越來越難......今天要來解的叫做 `柯里化`,在網路上找到其他大大的教學,在此飲用兼引用 原理是將傳入 function 的參數,利用 closure(閉包)特性,將它們存放在另一個 function 中並當做回傳值,而這些 function 會形成一個鏈(chain),待最後參數傳入,完成運算。 ---