让小伙伴挠头的JavaScript中缺失的数学方法
在这篇文章中,我们将探讨 JavaScript 中一些缺失的数学方法以及如何编写相应的函数。
JavaScript 的 Math 对象包含一些非常有用和强大的数学操作,可以在 Web 开发中使用,但它缺少许多其他语言提供的重要操作(例如 Haskell,它拥有大量这些操作)。
求和Sum
你可能还记得在学校里,“sum”是“add”的同义词。例如,如果对数字1、2和3求和,实际上就是1 + 2 + 3。 sum函数将涉及对数组中所有值进行求和。
有两种方法可以编写这个函数:可以使用for循环,也可以使用reduce函数。如果想重新熟悉reduce函数,可以阅读关于在JavaScript中使用map()和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函数更加简洁。 例如:
sum([1,2,3,4]) === 10 // 1 + 2 + 3 + 4
sum([2,4,6,8]) === 20 // 2 + 4 + 6 + 8
能够对一组数字求和可能是 JavaScript Math 对象中最有用和最需要的“缺失”函数之一。同样,sum函数可以作为一个很好的检查工具。例如,在数独游戏中,可以通过检查列或行的总和是否为45(1 + 2 + 3 + 4 +…+ 9)来检查用户是否没有重复数字。如果想要计算总账单,该函数在在线购物应用程序中也非常适用——假设所有的价格都存储在一个数组中。
以下是一个购物应用程序示例,展示了如何在代码中使用它:
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
在JavaScript的Math对象中,我们可以找到一些常用的数学操作,如加法、减法和除法。然而,JavaScript缺少一个重要的数学操作,即乘法(乘积)。
乘积是指将一组数字相乘得到的结果。它在许多场景下都很有用,例如计算物品的总价格,计算一组数据的平均值等。
幸运的是,我们可以编写自己的函数来实现乘积操作。下面是一个使用for循环来计算乘积的示例函数:
function product(array) {
let result = 1;
for (let i = 0; i < array.length; i++) {
result *= array[i];
}
return result;
}
在上述示例中,定义了一个名为product的函数,它接受一个数组作为参数。我们初始化一个变量result为1,然后使用for循环遍历数组中的每个元素,将其与result相乘并更新result的值。最后,我们返回计算得到的乘积结果。
使用reduce
优化:
function product(array){
return array.reduce((total, num) => total*num, 1)
}
使用方式:
product([2,5,8,6]) === 480 // 2 x 5 x 8 x 6
product([3,7,10,2]) === 420 // 3 x 7 x 10 x 2
在数组中使用:
const pricePerKg = 1.50
const numberOfKg = 10
const conversionRate = 1.16
const conversion = [1.50, 10, 1.16]
const USprice = product([pricePerKg,numberOfKg,conversionRate])
判断奇数和偶数
JavaScript确实缺少一些用于判断奇数和偶数的内置数学方法。然而,我们可以采用一些技巧和逻辑来实现这些功能。
判断奇数和偶数的常见方法是通过使用取余运算符(%)。如果一个数除以2的余数为0,则它是偶数;如果余数为1,则它是奇数。
下面是一个示例函数,用于判断一个数字是否为奇数:
function isOdd(number) {
return number % 2 === 1;
}
在上述示例中,我们定义了一个名为isOdd的函数,它接受一个数字作为参数。我们使用取余运算符将该数字除以2,然后判断余数是否等于1。如果余数等于1,则返回true,表示该数字是奇数;否则,返回false。
同样地,我们可以编写一个函数来判断一个数字是否为偶数:
function isEven(number) {
return number % 2 === 0;
}
在这个示例中,我们使用取余运算符将数字除以2,并判断余数是否为0。如果余数为0,则返回true,表示该数字是偶数;否则,返回false。
通过这些函数,我们可以方便地判断任意数字是奇数还是偶数。例如,如果我们调用isOdd函数并传入数字5,它将返回true,表示5是一个奇数。同样地,如果我们调用isEven函数并传入数字10,它将返回true,表示10是一个偶数。
三角数 triangleNumber
三角数是一系列自然数的和,其规律如下:第 n 个三角数等于从 1 到 n 的所有自然数的和。
在 JavaScript 的 Math 对象中,没有内置的方法来计算三角数。然而,我们可以使用循环来编写一个函数来计算三角数。
下面是一个示例函数,用于计算给定数字的三角数:
function triangleNumber(n) {
let sum = 0;
for (let i = 1; i <= n; i++) {
sum += i;
}
return sum;
}
上面for
循环写法是最贱的的一种写法,运行效率很低。三角数有一个非常简单的公式:
0.5 * (number) * (number + 1),写法如下:
function triangleNumber(number){
return 0.5 * number * (number + 1)
}
使用方式:
triangleNumber(7) === 28 // 0.5 x 7 x 8
triangleNumber(123) === 7626 // 0.5 x 123 x 124
阶乘 Factorial
阶乘是指一个正整数 n 与小于等于它的所有正整数的乘积。阶乘通常表示为 n!。
在 JavaScript 的 Math 对象中,没有内置的方法来计算阶乘。然而,我们可以使用循环或递归来编写一个函数来计算阶乘。
下面是一个使用循环计算阶乘的示例函数:
function factorial(n) {
if (n === 0 || n === 1) {
return 1;
}
let result = 1;
for (let i = 2; i <= n; i++) {
result *= i;
}
return result;
}
使用递归创建阶乘函数:
function factorial(number){
if (number <= 0){
return 1
}
else{
return number * factorial(number - 1)
}
}
使用方式:
factorial(5) === 120 // 5 x 4 x 3 x 2 x 1
因子 Factors
因子是指能够整除给定数的所有正整数。也就是说,如果一个数能够被另一个数整除,那么这个数就是另一个数的因子。
在 JavaScript 的 Math 对象中,没有内置的方法来计算一个数的所有因子。然而,我们可以使用循环来编写一个函数来计算一个数的因子。
例如:
- 10的因数是:1和10;2和5。
- 18的因数是:1和18;2和9;3和6。
下面是一个示例函数,用于计算给定数字的所有因子:
function factors(number) {
const factors = [];
for (let i = 1; i <= number; i++) {
if (number % i === 0) {
factors.push(i);
}
}
return factors;
}
使用方式:
factors(50) === [1,2,5,10,25,50]
素数 isPrime
素数是指除了 1 和自身外,没有其他因子的正整数。也就是说,不能被其他数整除的数就是素数。
在 JavaScript 的 Math 对象中,没有内置的方法来判断一个数是否为素数。然而,我们可以使用循环和逻辑来编写一个函数来判断一个数是否为素数。
下面是一个示例函数,用于判断给定数字是否为素数:
function isPrime(number) {
if (number <= 1) {
return false;
}
for (let i = 2; i < number; i++) {
if (number % i === 0) {
return false;
}
}
return true;
}
定义了一个名为 isPrime 的函数,它接受一个数字作为参数。首先检查给定数字是否小于等于 1,如果是,则直接返回 false,因为小于等于 1 的数不是素数。然后,使用循环从 2 开始遍历到给定数字的前一个数,如果给定数字能够被当前数字整除(即余数为 0),则返回 false,表示它不是素数。如果循环结束后仍然没有找到可以整除给定数字的数,则返回 true,表示它是素数。
通过这个函数,可以方便地判断任意数字是否为素数。例如,如果调用 isPrime 函数并传入数字 7,它将返回 true,表示 7 是一个素数。同样地,如果调用 isPrime 函数并传入数字 4,它将返回 false,表示 4 不是素数。
使用方式:
isPrime(3) === true
isPrime(76) === false
isPrime(57) === true
最大公约数(Greatest Common Divisor,简称gcd)
最大公约数是指能够同时整除两个或多个数的最大正整数。在数学中,常用符号表示最大公约数为gcd。
在 JavaScript 的 Math 对象中,没有内置的方法来计算最大公约数。然而,我们可以使用一些算法来编写一个函数来计算最大公约数。
下面是一个示例函数,用于计算两个数的最大公约数:
function gcd(a, b) {
if (b === 0) {
return a;
}
return gcd(b, a % b);
}
定义一个名为 gcd 的函数,它接受两个数字 a 和 b 作为参数。使用递归的方式来计算最大公约数。如果 b 的值为 0,那么 a 就是最大公约数,直接返回 a。否则,将调用 gcd 函数,将 b 和 a 除以 b 的余数作为新的参数传入。这样,不断地递归调用 gcd 函数,直到 b 的值为 0,找到了最大公约数。
通过这个函数,可以轻松地计算两个数的最大公约数。例如,如果调用 gcd 函数并传入数字 48 和 36,它将返回 12,表示 48 和 36 的最大公约数为 12。
使用方式:
gcd(24, 16) === 8
gcd(75, 1) === 1
最小公倍数(Lowest Common Multiple,简称lcm)
最小公倍数是指能够同时被两个或多个数整除的最小正整数。在数学中,常用符号表示最小公倍数为lcm。
例如:
- 2和6的最小公倍数是6。
- 4和15的最小公倍数是60。
在 JavaScript 的 Math 对象中,没有内置的方法来计算最小公倍数。然而,可以使用一些算法来编写一个函数来计算最小公倍数。
下面是一个示例函数,用于计算两个数的最小公倍数:
function lcm(a, b) {
return (a * b) / gcd(a, b);
}
function gcd(a, b) {
if (b === 0) {
return a;
}
return gcd(b, a % b);
}
定义两个函数:lcm 和 gcd。首先,使用一个 gcd 函数,该函数的实现与前面的示例相同,用于计算两个数的最大公约数。接下来,在 lcm 函数中,通过两个数的乘积除以它们的最大公约数来计算最小公倍数。
通过这个函数,可以轻松地计算两个数的最小公倍数。例如,如果调用 lcm 函数并传入数字 4 和 6,它将返回 12,表示 4 和 6 的最小公倍数为 12。
使用方式:
lcm(12, 9) === 36 // (12 x 9)/3