超实用的 JavaScript 数学方法(算法)代码片段

Collatz algorithm(考拉兹算法)

如果 n 是偶数,则返回 n/2 。否则返回 3n+1 。

  1. const collatz = n => (n % 2 == 0) ? (n / 2) : (3 * n + 1);
  2. // collatz(8) --> 4
  3. // collatz(5) --> 16
  4. 考拉兹猜想(英语:Collatz conjecture),又称为奇偶归一猜想、3n+1猜想、冰雹猜想、角谷猜想、哈塞猜想、乌拉姆猜想或叙拉古猜想,是指对于每一个正整数,如果它是奇数,则对它乘3再加1,如果它是偶数,则对它除以2,如此循环,最终都能够得到1。 – 维基百科。


Distance between two points (两点之间的欧氏距离)

使用 Math.hypot() 计算两点之间的欧氏距离( Euclidean distance)。

  1. const distance = (x0, y0, x1, y1) => Math.hypot(x1 - x0, y1 - y0);
  2. // distance(1,1, 2,3) -> 2.23606797749979
  3. 欧氏距离( Euclidean distance)是一个通常采用的距离定义,它是在m维空间中两个点之间的真实距离。


Divisible by number (可以被某个数整除)

使用模运算符(%)来检查余数是否等于 0 。

  1. const isDivisible = (dividend, divisor) => dividend % divisor === 0;
  2. // isDivisible(6,3) -> true


Even or odd number (判断奇偶数)

使用模运算符(%)来检查数字是奇数还是偶数。如果数字是偶数,则返回 true ,如果是奇数,则返回 false 。

  1. const isEven = num => num % 2 === 0;
  2. // isEven(3) -> false


Factorial (阶乘)

使用递归。如果 n 小于或等于 1 ,则返回 1 。否则返回 n 和 n - 1 的阶乘。

  1. const factorial = n => n < = 1 ? 1 : n * factorial(n - 1);
  2. // factorial(6) -> 720


Fibonacci array generator (斐波纳契数组发生器)

创建一个指定长度的空数组,初始化前两个值( 0 和 1 )。使用 Array.reduce() 向数组中添加值,使用最的值是两个值的和(前两个除外)。

  1. const fibonacci = n =>
  2. Array(n).fill(0).reduce((acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), []);
  3. // fibonacci(5) -> [0,1,1,2,3]


Greatest common divisor (GCD) (最大公约数)

使用递归。当 y 等于 0 的情况下,返回 x 。否则,返回 y 和 x/y 余数最大公约数。

  1. const gcd = (x, y) => !y ? x : gcd(y, x % y);
  2. // gcd (8, 36) -> 4


Hamming distance (汉明距离)

使用XOR运算符( ^ )查找这两个数字之间的位差,使用 toString(2) 转换为二进制字符串。使用 match(/1/g) 计算并返回字符串中 1 的数量。

  1. const hammingDistance = (num1, num2) =>
  2. ((num1 ^ num2).toString(2).match(/1/g) || '').length;
  3. // hammingDistance(2,3) -> 1
  4. 在信息论中,两个等长字符串之间的汉明距离(英语:Hamming distance)是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。- 维基百科


Percentile (百分比)

使用 Array.reduce() 来计算有多少数字小于等于该值,并用百分比表示。

  1. const percentile = (arr, val) =>
  2. 100 * arr.reduce((acc,v) => acc + (v < val ? 1 : 0) + (v === val ? 0.5 : 0), 0) / arr.length;
  3. // percentile([1,2,3,4,5,6,7,8,9,10], 6) -> 55


Powerset (幂集)

使用 Array.reduce() 与 Array.map() 结合来遍历元素,并将其组合成一个包含所有排列组合的数组。

  1. const powerset = arr =>
  2. arr.reduce((a, v) => a.concat(a.map(r => [v].concat(r))), [[]]);
  3. // powerset([1,2]) -> [[], [1], [2], [2,1]]


Round number to n digits (精确的几位小数)

使用 Math.round() 和模板字面量将数字四舍五入为指定的小数位数。 省略第二个参数 decimals ,数字将被四舍五入到一个整数。

  1. const round = (n, decimals=0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`);
  2. // round(1.005, 2) -> 1.01


Standard deviation (标准偏差)

使用 Array.reduce() 来计算均值,方差已经值的方差之和,方差的值,然后确定标准偏差。 您可以省略第二个参数来获取样本标准偏差,或将其设置为 true 以获得总体标准偏差。

  1. const standardDeviation = (arr, usePopulation = false) => {
  2. const mean = arr.reduce((acc, val) => acc + val, 0) / arr.length;
  3. return Math.sqrt(
  4. arr.reduce((acc, val) => acc.concat(Math.pow(val - mean, 2)), [])
  5. .reduce((acc, val) => acc + val, 0) / (arr.length - (usePopulation ? 0 : 1))
  6. );
  7. };
  8. // standardDeviation([10,2,38,23,38,23,21]) -> 13.284434142114991 (sample)
  9. // standardDeviation([10,2,38,23,38,23,21], true) -> 12.29899614287479 (population)



猜你喜欢

转载自blog.csdn.net/qq_26522773/article/details/79298460