js實現引數定長 不定長的柯里化

2022-07-02 15:00:12 字數 1829 閱讀 7832

文章原文:

題目1:把乙個計算加法的函式fn 進行柯里化,其中fn 分為 引數個數固定 和 引數個數不固定兩種

引數個數固定的柯里化實現:

function fn(a, b, c) 

function curry(fn) else

}} // 用例一

let c1 = curry(fn, 1);

let c2 = curry(c1, 2);

let c3 = curry(c2, 3);

console.log(c3()) // 6

// 用例二

let curried = curry(fn);

console.log(curried(1, 2, 3)) // 6

console.log(curried(1, 2)(3)) // 6

console.log(curried(1)(2, 3)) // 6

console.log(curried(1)(2)(3)) // 6

// 用例三

console.log(curry(fn, 1, 2, 3)()) // 6

console.log(curry(fn, 1, 2)(3)) // 6

console.log(curry(fn, 1)(2, 3)) // 6

console.log(curry(fn, 1)(2)(3)) // 6

引數個數不固定的柯里化實現

function curry(fn) 

// 重寫tostring

curried.tostring = function()

return curried;

}function fn() , 0)

}var add = curry(fn);

console.log(add(1)(2)(3)(4)) // 10

console.log(add(1, 2)(3, 4)(5, 6)) // 21

題目2: 實現add(1)(2)(3)(4)的列印結果為10,並且要求可以隨意呼叫,不過每次只傳乙個引數,如add(1)(2)(3)(4)(5)的列印結果為15

實現**如下:

function add(x) ;

tmp.tostring = function () ;

return tmp;

}console.log(add(1)(2)(3)) // 6

console.log(add(1)(2)(3)(4)) // 10

console.log(add(1)(2)(3)(4)(5)) // 15

題目3: 實現add(1, 2)(3)的列印結果為6,add(1)(2, 3, 4)(5) 結果為15, 意思就是 傳遞的引數個數不固定

實現**如下:

function add () 

fn.tostring=function())

}return fn

}console.log(add(1, 2)(3)) // 6

console.log(add(1)(1,2,3)(2)) // 9

console.log(add(1)(2, 3, 4)(5)) // 15

上面用到了tostring 這裡就聯想到了valueof 這兩者的區別簡單來說如下:

這兩個方法一般是交由js去隱式呼叫,以滿足不同的運算情況。

在數值運算裡,會優先呼叫valueof(),如a + b

在字串運算裡,會優先呼叫tostring(),如alert(c)。

當然更深入的說法還有,不過這裡就不討論了。

不定長引數函式的實現

原始碼如下 int sum int num,return ret int main int argc,char argv 所謂不定長引數,就是函式的形參數量不定,型別也可能是不定的。我們把像上面的函式sum中如 int num 這樣的引數叫做 有名引數 後面用 代表的都是 匿名引數 有名引數是可以在...

Python的不定長引數研究

以乙個 開始的引數,代表乙個任意長的元組 def mul arg print arg mul 1,2,3,4,5,6,7,hello panfei 1,2,3,4,5,6,7,hello panfei 乙個元組 乙個以 開始的引數,代表乙個字典 def mul2 arg print arg mul2...

Java中不定長度的引數

什麼是不定長度的引數呢,就是沒有規定引數的長度,可以用三個小數點意為省略的意思,比如下面 package laojiuxuetangzhixunhuan public class testcanshu public static void paramtest string s,int nums sy...