让小伙伴挠头的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
全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务