為什麼這個函數的名字是reduce?
01-21
我的英語不好,我理解的reduce是減少的意思。但這個函數實現的功能我感覺和減少就沒有關係。所以請教該怎樣理解reduce?
reduce翻譯成規約,意思其他答案裡面已經講了。
實際上函數名不應取reduce,應該叫fold,而且要區分foldl和foldr左右兩個版本。並行計算裡面的那個reduce有個隱含前提,是reduce over monoid,所以結果才與reduce方向無關,可以做有效的並行化。
歸約這是一個函數式編程裡面,高階函數裡面很基礎的概念。不過我最早聽到這個詞是在並行計算裡面。函數式編程裡面有時也稱作 fold ,也就是摺疊,這個更好理解吧。詳情可參見wikipedia,裡面提到了 In functional programming, fold – also known variously as reduce, accumulate, aggregate, compress, or inject
你找一個你覺得好理解的詞就OK了。
這就是MapReduce中的reduce,也叫fold。
wikipedia鏈接:Fold (higher-order function)SICP中用scheme實現的叫accumulate。
C++中是std::accumulate。wiki中Folds in various languages部分講了各種語言中的這個函數的叫法。
reduce 在這裡應該翻譯成「歸納」。
reduce在函數式語言里就是要減少的意思,要合併結果,多項變成一項。至於怎麼合併,就看reduce的函數是什麼。range得到一個collection(或sequence),裡面有多項。reduce函數是add,結果是一項。當然reduce後也可以還是一個collection,那是因為把collection整體看做一項結果。
別糾結了,這個函數如此難懂,完全不符合python的風格,以致於在python3中被刪除了。
題主還是趁早改邪歸正,拋棄python2,投入python3的陣營吧!....reduce 很多項成一項啊。這個很難理解么?
推薦閱讀:
※化工男悉尼留學移民雅思考試4個7分虐心經歷和雅思高分經驗分享(從5.5到8.5)?
※雅思高分經驗分享?
※把boy拼成boi是不是很娘的做法?
※從語言學上分析,英語可不可以漢字化?