js的math中缺少的数学方法小结
作者:dralexsanderl
JavaScript
Math
对象包含一些真正有用且强大的数学运算,可用于 Web
开发,但它缺乏大多数其他语言提供的许多重要运算,本文主要补充一些常用的数学方法。
sum 求和
sum
函数将涉及对数组中的所有值求和。
有两种编写此函数的方法:我们可以使用循环for
,或者使用reduce
函数。
使用for
循环:
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) }
这两个函数的工作方式完全相同(reduce
函数只是一个内置for
循环),并且将返回相同的数字(给定相同的数组)。但reduce
功能要简洁得多。
能够对数字列表求和可能是 JavaScript
的Math
对象中最有用和最需要的但是缺失的数学操作。sum
函数是一个很好的检查工具。例如,在数独中,我们可以通过检查列/行之和是否为来检查用户在该列或行中是否没有重复。如果我们想计算出总账单,那么该函数在在线购物应用程序中也能很好地工作——假设所有价格都存储在一个数组中。
按照购物应用程序示例,下面是示例:
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
函数将以与该函数类似的方式工作sum,只不过我们不是将列表中的所有数字相加,而是将它们相乘。
同样我们可以使用与第一个sum
函数几乎相同的for
循环:
function product(array){ let total = 1 for(let count = 0; count < array.length; count++){ total = total * array[count] } return total }
注意,我们用1来初始化total
变量,否则我们总是会得到.
使用reduce
:
function product(array){ return array.reduce((total, num) => total*num, 1) }
这个函数的用途可能看起来并不明显。但它在尝试在一次计算中进行多次转换时非常有用。例如,如果我们想查找 10 个苹果的价格(每个 1.5 元),满10个打9折,与其使用巨大的乘法和,不如将所有值存储在数组中并使用我们刚刚编写的product
函数。
const pricePer = 1.50 const number = 10 const discount = 0.9 const conversion = [1.5, 10, 0.9] const price = product(conversion)
奇数和偶数
这个函数将接受一个数字,并根据该数字是奇数还是偶数返回true
或者false
。
在 JavaScript
中编写这些函数的最简单方法是使用余数运算符(%
)。当一个数字除以另一个数字时,这将返回余数。例如:
11 % 3 === 2 // 11 - 3 * 3 = 2
判断是否偶数
function isEven(number){ return number % 2 === 0 }
判断是否是奇数
function isOdd(number){ return number % 2 !== 0 }
能够检查一个数字是奇数还是偶数至关重要,而且非常简单。它可能看起来不那么重要,但可以作为一种很好的输入验证技术 - 例如,使用数组长度来做判断,简单地通过检查两人游戏的获胜者。可以跟踪已经玩了多少轮。假设第一轮计为 1,如果数字为奇数,则玩家 1 获胜,如果数字为偶数,则玩家 2 获胜
function checkWinner(gamesPlayed){ let winner if(isOdd(gamesPlayed)){ winner = "player1" } else{ winner = "player2" } return winner }
这些函数是可以互换的,我们很可能只需要使用其中一个。
factorial 阶乘
自然数(任何严格大于 0 的整数)的阶乘是所有小于或等于该数的数的乘积。例如: 3 阶乘(用 表示3!)是3 x 2 x 1 = 6
。
有两种创建factorial
函数的方法:使用for
循环和使用递归。递归算法,它们本质上是重复调用自身直到达到“基本情况”的函数。
使用for
循环:
function factorial(number){ let total = 1 for (let i = 1; i < number+1; i++){ total = total * i } return total }
这种方式循环遍历从 1 到 number
的所有数字(每次传递递增),并将总数乘以每个数字,然后返回最终总数(数字阶乘)。
使用递归:
function factorial(number){ if (number <= 0){ return 1 } else{ return number * factorial(number - 1) } }
在这个函数中,我们的基本情况为零,因为0!
的值为 1
。这意味着,当数字通过函数时,只要它不为零,它就会将自身乘以factorial(number - 1)
factors 因子
因子成对出现,每对因子相乘形成原始数字。例如:
- 10的因数是:1和10;2和5。
- 18的因数是:1和18;2和9;3和6。
factors
函数接受一个数字,并返回一个包含其所有因子的数组。编写此函数的方法有很多种,但最简单的方法是使用命令式方法:
function factors(number){ let factorsList = [] for(let count = 1; count < number+1; count++){ if(number % count === 0){ factorsList.push(count) } } return factorsList }
首先,我们创建一个空数组。然后,我们使用for
循环遍历从 1 到数字本身的每个整数,并在每次传递时检查该数字是否可被该整数整除
查找数字的因子非常有用,特别是当我们需要组建组时 - 例如在在线游戏中,当需要每个团队中有相同数量的用户时。例如,如果我们有 20 个用户,每个团队需要 10 名玩家,您可以使用一个factors
函数将这 10 名用户分成两个团队进行匹配。同样,如果每支球队需要四名球员,可以使用该factors
函数将四支球队匹配为五支球队。
function createTeams(numberOfPlayers, numberOfTeams){ let playersInEachTeam if(factors(numberOfPlayers).includes(numberOfTeams)){ playersInEachTeam = numberOfPlayers / numberOfTeams } else{ playersInEachTeam = "wait for more players" } return playersInEachTeam }
isPrime 质数
质数:一个大于1的自然数,除了1和它本身外,不能被其他自然数整除
我们可以结合上一个factors
方法来实现。
function isPrime(number){ return factors(number).length === 2 }
gcd 最大公约数
最大公约数运算有时被称为“最大公因数”,它可以找到两个数字共有的最大因数。
例如:
- 12和15的GCD是3。
- 8 和 4 的 GCD 是 4。
解决这个问题的一个简单方法是列出每个数字的所有因数(使用我们上面提到的factors``)并比较这些列表。然而,比较列表是一个效率低下的数组操作。
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] }
还有一种更简洁的方法是使用递归。这是一个非常著名的算法,称为欧几里得算法:
function gcd(number1, number2){ if(number2 === 0){ return number1 } else{ return gcd(number2, number1%number2) } }
lcm 最小公倍数
最小公倍数与最大公约数的类似,但是是找到的是两个数字都是其因子的最小整数。
例如:
- 2和6的最小公倍数是6。
- 4和15的最小公倍数是60。
对于这个函数,我们不能只创建一个包含每个数字的所有倍数的数组,因为这将是一个无限列表。
可以使用一个非常有用的公式来计算最小公倍数:
(number1 x number2) / 最大公约数
比如:
(2 x 6) / gcd(2,6) = 12/2 = 6
实现:
function lcm(number1, number2){ return (number1*number2)/gcd(number1, number2) }
这个函数可能没有任何明显的用途,但它非常适合两个事件以不同时间间隔发生的情况,这意味着我们可以使用 lcm
来找出两个事件何时同时发生。
例如,如果图像被编程为每六秒出现一次,一段文本被编程为每八秒出现一次,则图像和段落将在第 24 秒第一次一起出现。
到此这篇关于js的math中缺少的数学方法小结的文章就介绍到这了,更多相关js math缺少数学方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!