摘要:有副作用尾遞歸,即在函數(shù)末尾自調(diào)用自己想的使用累加器實(shí)現(xiàn)函數(shù)式重寫下面這種寫法,很不優(yōu)雅最好可以實(shí)現(xiàn)組合任意個函數(shù),效果如下實(shí)現(xiàn)思路在我在
解決大數(shù)相加的方法有很多,網(wǎng)上很容易搜到,下面介紹兩種,一種是在網(wǎng)上抄的,一種是自己想的,我將他們都用函數(shù)式的方式重寫了一遍。
這種是在網(wǎng)上抄的,的確非常簡潔function add(a,b) { let res="", c=0; a = a.split(""); b = b.split(""); while (a.length || b.length || c){ c += ~~a.pop() + ~~b.pop(); res = c % 10 + res; c = c>9; } return res.replace(/^0+/,""); }
函數(shù)式重寫,重點(diǎn)在尾遞歸,這是在函數(shù)式編程中代替while的寫法。
let compose = (f, g) => (...args) => f(g(...args)); let addUnit = a => b => b + a; let myPop = a => a.pop(); // 有副作用 let myNumber = a => ~~a; let remainderTen = x => x % 10; let isGreeterNine = x => x > 9; let replaceHeadZero = x => x.replace(/^0+/, ""); let pAndN = compose(myNumber, myPop); let loop = (a, b, res, c) => { //尾遞歸,即在函數(shù)末尾自調(diào)用 if (!a.length && !b.length && !c) return res; let getC = compose(addUnit(pAndN(b)), addUnit(pAndN(a))); let getEes = compose(addUnit(res), remainderTen); return loop(a, b, getEes(getC(c)), isGreeterNine(getC(c))); } let add = (a, b) => compose(replaceHeadZero, loop)(a.split(""), b.split(""), "", 0);自己想的
使用累加器實(shí)現(xiàn)
function add(a, b) { a = a.split("").reverse(); b = b.split("").reverse(); function addMap(aArrayIns, bArrayIns) { return aArrayIns.reduce((accumulator, currentValue, index) => { let c = ~~bArrayIns[index] + ~~currentValue + ~~accumulator[index]; if (c >= 10) { accumulator[index] = (c - 10).toString(); accumulator.push("1"); } else { accumulator[index] = c.toString(); } return accumulator; }, []).reverse().join(""); } return a.length >= b.length ? addMap(a, b) : addMap(b, a); }
函數(shù)式重寫
let compose = (f, g) => x => f(g(x)); let myReverse = x => { let [...y] = x; return y.reverse(); }; let mySplit = x => x.split(""); let myToString = x => x.toString(); let myPushOne = x => { let [...y] = x; y.push("1"); return y; } let setValue = index => value => targetArray => { let [...y] = targetArray; y[index] = value; return y; } let splitAndReverse = compose(myReverse, mySplit); let myReduce = x => y => y.reduce(fnHandleAdd(splitAndReverse(x)), []); let fnHandleAdd = a => (accumulator, currentValue, index) => { let c = ~~a[index] + ~~currentValue + ~~accumulator[index]; return c >= 10 ? compose(myPushOne, setValue(index)(myToString(c - 10)))(accumulator) : setValue(index)(myToString(c))(accumulator); }; let addMap = (a, b) => compose(compose(R.join(""), myReverse), compose(myReduce(b), splitAndReverse))(a); let add = (a, b) => a.length >= b.length ? addMap(a, b) : addMap(b, a);
下面這種寫法,很不優(yōu)雅
let addMap = (a, b) => compose(compose(R.join(""), myReverse), compose(myReduce(b), splitAndReverse))(a);
最好compose可以實(shí)現(xiàn)組合任意個函數(shù),效果如下
let addMap = (a, b) => compose(R.join(""), myReverse, myReduce(b), splitAndReverse)(a);
實(shí)現(xiàn)思路在:https://github.com/zhuanyongx...
我在github https://github.com/zhuanyongx...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/95301.html
摘要:給定表,存在函數(shù),對任意給定的關(guān)鍵字值,代入函數(shù)后若能得到包含該關(guān)鍵字的記錄在表中的地址,則稱表為哈希表,函數(shù)為哈希函數(shù)。而中的對象就是基于哈希表結(jié)構(gòu),所以我們構(gòu)造一個對象即可,是當(dāng)前遍歷到的值,是其與目標(biāo)值的差。 大部分玩前端的小伙伴,在算法上都相對要薄弱些,畢竟調(diào)樣式、調(diào)兼容就夠掉頭發(fā)的了,哪還有多余的頭發(fā)再去折騰。 確實(shí)在前端中需要使用到算法的地方是比較少,但若要往高級方向發(fā)展,...
摘要:類的一個子類,表明斷言的失敗。可用于測試回調(diào)函數(shù)的參數(shù)。使用比較法測試參數(shù)與參數(shù)是否不全等。等待的完成,如果是一個函數(shù),則立即調(diào)用該函數(shù)并等待返回的完成,然后檢查是否被。 FEAT FrontEnd Automates Test 前端全自動化測試 序章 文章開頭先引一個知乎上的問答:如何進(jìn)行前端自動化測試? 我相信做過前端的朋友都有這個疑問。希望這篇文章里你能看到一些別人的測試方法,幫...
摘要:因?yàn)楸怀藬?shù)每一位數(shù)字和乘數(shù)相乘的結(jié)果是依次錯開的,所以就沒問題。判斷兩個數(shù)的大小的方法,是先判斷其長度,如果長度不一樣,則較長的較大,如果長度一樣,則需要比較每一位。 Multiply Strings Given two numbers represented as strings, return multiplication of the numbers as a string. ...
摘要:解題思路羅馬數(shù)字是符號和加操作的一個組合。他基于以下七個符號。組合規(guī)則基本數(shù)字中的任何一個,自身連用構(gòu)成數(shù)目,或者放在大數(shù)的右邊連用構(gòu)成數(shù)目,都不能超過三個放在大數(shù)的左邊只能用一個。想更一進(jìn)步的支持我,請掃描下方的二維碼,你懂的 Given a roman numeral, convert it to an integer. Input is guaranteed to be...
講義內(nèi)容:JS 誕生的背景、基本類型、運(yùn)算符 以下內(nèi)容只涉及 ES5 標(biāo)準(zhǔn),ES6 增加的新內(nèi)容可以在網(wǎng)上查找到。 JS 誕生的背景 上世紀(jì) 90 年代網(wǎng)景公司開發(fā)的瀏覽器獨(dú)步天下 一個叫做 Brendan Eich 的工程師受命于開發(fā)一款腳本語言,來增強(qiáng)瀏覽器的功能。 這名工程師花費(fèi)了 10 天時間設(shè)計出了第一個版本,名叫 LiveScript。 后來因?yàn)楫?dāng)時 Java 正紅,公司將其改名為 J...
閱讀 3280·2023-04-26 02:42
閱讀 791·2021-10-09 09:41
閱讀 3189·2021-09-06 15:02
閱讀 700·2019-08-26 10:45
閱讀 480·2019-08-23 15:53
閱讀 733·2019-08-22 18:10
閱讀 550·2019-08-22 18:01
閱讀 3517·2019-08-22 17:34