国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

兩個函數(shù)式解決大數(shù)相加的方法

AlanKeene / 3516人閱讀

摘要:有副作用尾遞歸,即在函數(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

相關(guān)文章

  • 【前端來刷LeetCode】兩數(shù)之和與兩數(shù)相加

    摘要:給定表,存在函數(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ā)展,...

    BLUE 評論0 收藏0
  • 前端集成測試(一)- 認(rèn)識nodeassert模塊

    摘要:類的一個子類,表明斷言的失敗。可用于測試回調(diào)函數(shù)的參數(shù)。使用比較法測試參數(shù)與參數(shù)是否不全等。等待的完成,如果是一個函數(shù),則立即調(diào)用該函數(shù)并等待返回的完成,然后檢查是否被。 FEAT FrontEnd Automates Test 前端全自動化測試 序章 文章開頭先引一個知乎上的問答:如何進(jìn)行前端自動化測試? 我相信做過前端的朋友都有這個疑問。希望這篇文章里你能看到一些別人的測試方法,幫...

    Jinkey 評論0 收藏0
  • [Leetcode] Multiply String and Big Interger 大數(shù)乘法加法

    摘要:因?yàn)楸怀藬?shù)每一位數(shù)字和乘數(shù)相乘的結(jié)果是依次錯開的,所以就沒問題。判斷兩個數(shù)的大小的方法,是先判斷其長度,如果長度不一樣,則較長的較大,如果長度一樣,則需要比較每一位。 Multiply Strings Given two numbers represented as strings, return multiplication of the numbers as a string. ...

    keithxiaoy 評論0 收藏0
  • LeetCode13 - Roman to Integer

    摘要:解題思路羅馬數(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...

    elisa.yang 評論0 收藏0
  • ?前端教學(xué)講義:JS基礎(chǔ)

    講義內(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...

    walterrwu 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<