js的math中缺少的數(shù)學(xué)方法小結(jié)
JavaScript
Math
對(duì)象包含一些真正有用且強(qiáng)大的數(shù)學(xué)運(yùn)算,可用于 Web
開(kāi)發(fā),但它缺乏大多數(shù)其他語(yǔ)言提供的許多重要運(yùn)算,本文主要補(bǔ)充一些常用的數(shù)學(xué)方法。
sum 求和
sum
函數(shù)將涉及對(duì)數(shù)組中的所有值求和。
有兩種編寫(xiě)此函數(shù)的方法:我們可以使用循環(huán)for
,或者使用reduce
函數(shù)。
使用for
循環(huán):
function sum(array){ let total = 0 for(let count = 0; count < array.length; count++){ total = total + array[count] } return total }
使用reduce
:
function sum(array){ return array.reduce((sum, number) => sum + number, 0) }
這兩個(gè)函數(shù)的工作方式完全相同(reduce
函數(shù)只是一個(gè)內(nèi)置for
循環(huán)),并且將返回相同的數(shù)字(給定相同的數(shù)組)。但reduce
功能要簡(jiǎn)潔得多。
能夠?qū)?shù)字列表求和可能是 JavaScript
的Math
對(duì)象中最有用和最需要的但是缺失的數(shù)學(xué)操作。sum
函數(shù)是一個(gè)很好的檢查工具。例如,在數(shù)獨(dú)中,我們可以通過(guò)檢查列/行之和是否為來(lái)檢查用戶(hù)在該列或行中是否沒(méi)有重復(fù)。如果我們想計(jì)算出總賬單,那么該函數(shù)在在線(xiàn)購(gòu)物應(yīng)用程序中也能很好地工作——假設(shè)所有價(jià)格都存儲(chǔ)在一個(gè)數(shù)組中。
按照購(gòu)物應(yīng)用程序示例,下面是示例:
const prices = [2.80, 6.10, 1.50, 1.00, 8.99, 2.99] function totalCost(prices){ return prices.reduce((sum, item) => sum + item, 0) }
product 乘積
product
函數(shù)將以與該函數(shù)類(lèi)似的方式工作sum,只不過(guò)我們不是將列表中的所有數(shù)字相加,而是將它們相乘。
同樣我們可以使用與第一個(gè)sum
函數(shù)幾乎相同的for
循環(huán):
function product(array){ let total = 1 for(let count = 0; count < array.length; count++){ total = total * array[count] } return total }
注意,我們用1來(lái)初始化total
變量,否則我們總是會(huì)得到.
使用reduce
:
function product(array){ return array.reduce((total, num) => total*num, 1) }
這個(gè)函數(shù)的用途可能看起來(lái)并不明顯。但它在嘗試在一次計(jì)算中進(jìn)行多次轉(zhuǎn)換時(shí)非常有用。例如,如果我們想查找 10 個(gè)蘋(píng)果的價(jià)格(每個(gè) 1.5 元),滿(mǎn)10個(gè)打9折,與其使用巨大的乘法和,不如將所有值存儲(chǔ)在數(shù)組中并使用我們剛剛編寫(xiě)的product
函數(shù)。
const pricePer = 1.50 const number = 10 const discount = 0.9 const conversion = [1.5, 10, 0.9] const price = product(conversion)
奇數(shù)和偶數(shù)
這個(gè)函數(shù)將接受一個(gè)數(shù)字,并根據(jù)該數(shù)字是奇數(shù)還是偶數(shù)返回true
或者false
。
在 JavaScript
中編寫(xiě)這些函數(shù)的最簡(jiǎn)單方法是使用余數(shù)運(yùn)算符(%
)。當(dāng)一個(gè)數(shù)字除以另一個(gè)數(shù)字時(shí),這將返回余數(shù)。例如:
11 % 3 === 2 // 11 - 3 * 3 = 2
判斷是否偶數(shù)
function isEven(number){ return number % 2 === 0 }
判斷是否是奇數(shù)
function isOdd(number){ return number % 2 !== 0 }
能夠檢查一個(gè)數(shù)字是奇數(shù)還是偶數(shù)至關(guān)重要,而且非常簡(jiǎn)單。它可能看起來(lái)不那么重要,但可以作為一種很好的輸入驗(yàn)證技術(shù) - 例如,使用數(shù)組長(zhǎng)度來(lái)做判斷,簡(jiǎn)單地通過(guò)檢查兩人游戲的獲勝者。可以跟蹤已經(jīng)玩了多少輪。假設(shè)第一輪計(jì)為 1,如果數(shù)字為奇數(shù),則玩家 1 獲勝,如果數(shù)字為偶數(shù),則玩家 2 獲勝
function checkWinner(gamesPlayed){ let winner if(isOdd(gamesPlayed)){ winner = "player1" } else{ winner = "player2" } return winner }
這些函數(shù)是可以互換的,我們很可能只需要使用其中一個(gè)。
factorial 階乘
自然數(shù)(任何嚴(yán)格大于 0 的整數(shù))的階乘是所有小于或等于該數(shù)的數(shù)的乘積。例如: 3 階乘(用 表示3!)是3 x 2 x 1 = 6
。
有兩種創(chuàng)建factorial
函數(shù)的方法:使用for
循環(huán)和使用遞歸。遞歸算法,它們本質(zhì)上是重復(fù)調(diào)用自身直到達(dá)到“基本情況”的函數(shù)。
使用for
循環(huán):
function factorial(number){ let total = 1 for (let i = 1; i < number+1; i++){ total = total * i } return total }
這種方式循環(huán)遍歷從 1 到 number
的所有數(shù)字(每次傳遞遞增),并將總數(shù)乘以每個(gè)數(shù)字,然后返回最終總數(shù)(數(shù)字階乘)。
使用遞歸:
function factorial(number){ if (number <= 0){ return 1 } else{ return number * factorial(number - 1) } }
在這個(gè)函數(shù)中,我們的基本情況為零,因?yàn)?code>0!的值為 1
。這意味著,當(dāng)數(shù)字通過(guò)函數(shù)時(shí),只要它不為零,它就會(huì)將自身乘以factorial(number - 1)
factors 因子
因子成對(duì)出現(xiàn),每對(duì)因子相乘形成原始數(shù)字。例如:
- 10的因數(shù)是:1和10;2和5。
- 18的因數(shù)是:1和18;2和9;3和6。
factors
函數(shù)接受一個(gè)數(shù)字,并返回一個(gè)包含其所有因子的數(shù)組。編寫(xiě)此函數(shù)的方法有很多種,但最簡(jiǎn)單的方法是使用命令式方法:
function factors(number){ let factorsList = [] for(let count = 1; count < number+1; count++){ if(number % count === 0){ factorsList.push(count) } } return factorsList }
首先,我們創(chuàng)建一個(gè)空數(shù)組。然后,我們使用for
循環(huán)遍歷從 1 到數(shù)字本身的每個(gè)整數(shù),并在每次傳遞時(shí)檢查該數(shù)字是否可被該整數(shù)整除
查找數(shù)字的因子非常有用,特別是當(dāng)我們需要組建組時(shí) - 例如在在線(xiàn)游戲中,當(dāng)需要每個(gè)團(tuán)隊(duì)中有相同數(shù)量的用戶(hù)時(shí)。例如,如果我們有 20 個(gè)用戶(hù),每個(gè)團(tuán)隊(duì)需要 10 名玩家,您可以使用一個(gè)factors
函數(shù)將這 10 名用戶(hù)分成兩個(gè)團(tuán)隊(duì)進(jìn)行匹配。同樣,如果每支球隊(duì)需要四名球員,可以使用該factors
函數(shù)將四支球隊(duì)匹配為五支球隊(duì)。
function createTeams(numberOfPlayers, numberOfTeams){ let playersInEachTeam if(factors(numberOfPlayers).includes(numberOfTeams)){ playersInEachTeam = numberOfPlayers / numberOfTeams } else{ playersInEachTeam = "wait for more players" } return playersInEachTeam }
isPrime 質(zhì)數(shù)
質(zhì)數(shù):一個(gè)大于1的自然數(shù),除了1和它本身外,不能被其他自然數(shù)整除
我們可以結(jié)合上一個(gè)factors
方法來(lái)實(shí)現(xiàn)。
function isPrime(number){ return factors(number).length === 2 }
gcd 最大公約數(shù)
最大公約數(shù)運(yùn)算有時(shí)被稱(chēng)為“最大公因數(shù)”,它可以找到兩個(gè)數(shù)字共有的最大因數(shù)。
例如:
- 12和15的GCD是3。
- 8 和 4 的 GCD 是 4。
解決這個(gè)問(wèn)題的一個(gè)簡(jiǎn)單方法是列出每個(gè)數(shù)字的所有因數(shù)(使用我們上面提到的factors``)并比較這些列表。然而,比較列表是一個(gè)效率低下的數(shù)組操作。
function gcd(number1, number2){ let inCommon = [] for(let i of factors(number1)){ if(factors(number2).includes(i)){ inCommon.push(i) } } return inCommon.sort((a,b)=> b - a)[0] }
還有一種更簡(jiǎn)潔的方法是使用遞歸。這是一個(gè)非常著名的算法,稱(chēng)為歐幾里得算法:
function gcd(number1, number2){ if(number2 === 0){ return number1 } else{ return gcd(number2, number1%number2) } }
lcm 最小公倍數(shù)
最小公倍數(shù)與最大公約數(shù)的類(lèi)似,但是是找到的是兩個(gè)數(shù)字都是其因子的最小整數(shù)。
例如:
- 2和6的最小公倍數(shù)是6。
- 4和15的最小公倍數(shù)是60。
對(duì)于這個(gè)函數(shù),我們不能只創(chuàng)建一個(gè)包含每個(gè)數(shù)字的所有倍數(shù)的數(shù)組,因?yàn)檫@將是一個(gè)無(wú)限列表。
可以使用一個(gè)非常有用的公式來(lái)計(jì)算最小公倍數(shù):
(number1 x number2) / 最大公約數(shù)
比如:
(2 x 6) / gcd(2,6) = 12/2 = 6
實(shí)現(xiàn):
function lcm(number1, number2){ return (number1*number2)/gcd(number1, number2) }
這個(gè)函數(shù)可能沒(méi)有任何明顯的用途,但它非常適合兩個(gè)事件以不同時(shí)間間隔發(fā)生的情況,這意味著我們可以使用 lcm
來(lái)找出兩個(gè)事件何時(shí)同時(shí)發(fā)生。
例如,如果圖像被編程為每六秒出現(xiàn)一次,一段文本被編程為每八秒出現(xiàn)一次,則圖像和段落將在第 24 秒第一次一起出現(xiàn)。
到此這篇關(guān)于js的math中缺少的數(shù)學(xué)方法小結(jié)的文章就介紹到這了,更多相關(guān)js math缺少數(shù)學(xué)方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談js對(duì)象屬性 通過(guò)點(diǎn)(.) 和方括號(hào)([]) 的不同之處
下面小編就為大家?guī)?lái)一篇淺談js對(duì)象屬性 通過(guò)點(diǎn)(.) 和方括號(hào)([]) 的不同之處。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10為什么TypeScript的Enum會(huì)出現(xiàn)問(wèn)題
TypeScript引入了很多靜態(tài)編譯語(yǔ)言的特性,今天有一個(gè)類(lèi)型需要著重討論下,這就是enum,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06innerHTML在Mozilla Firefox和Opera下執(zhí)行的一個(gè)特例情況。
innerHTML在Mozilla Firefox和Opera下執(zhí)行的一個(gè)特例情況。...2007-01-01微信內(nèi)置瀏覽器WeixinJSBridge的使用技巧(隱藏右上角按鈕,獲取用戶(hù)網(wǎng)絡(luò)狀態(tài),支付等)
這篇文章主要介紹了微信內(nèi)置瀏覽器WeixinJSBridge的使用技巧,隱藏右上角按鈕,獲取用戶(hù)網(wǎng)絡(luò)狀態(tài),支付,隱藏下方工具欄等,需要的朋友可以參考下2024-02-02JavaScript設(shè)計(jì)模式之原型模式分析【ES5與ES6】
這篇文章主要介紹了JavaScript設(shè)計(jì)模式之原型模式,簡(jiǎn)單描述了原型模式的概念、原理,并結(jié)合實(shí)例形式分析了ES5與ES6實(shí)現(xiàn)原型模式的相關(guān)操作技巧,需要的朋友可以參考下2018-07-07Javascript 關(guān)于基本類(lèi)型和引用類(lèi)型的個(gè)人理解
這篇文章主要介紹了Javascript 關(guān)于基本類(lèi)型和引用類(lèi)型的個(gè)人理解,需要的朋友可以參考下2019-11-11