Math篇(数学、算法)

Collatz algorithm (考拉兹算法)

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

const collatz = n => (n % 2 == 0) ? (n / 2) : (3 * n + 1);
// collatz(8) --> 4
// collatz(5) --> 16

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

使用 Matg.hypot()来计算两点间的欧式距离。

const distance = (x0, y0, x1, y1) => Math.hypot(x1 - x0, y1 - y0);
// distance(1,1, 2,3) -> 2.23606797749979

Divisible by number (可否被整除)

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

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

Even or odd number (偶数或奇数)

使用模运算符(%)来计算一个数为偶数还是奇数。
返回 true为偶数,返回 false 则为奇数。

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

Factorial (阶乘)

使用递归。
如果 n小于或等于1,返回 1
其它情况,则返回 nn-1 的阶乘的积。

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

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

创建一个指定长度的空数组,初始化前两个值(01)。
使用 Array.reduce()将最后两个值的总和添加到数组中(前两个除外)。

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

Greatest common divisor (GCD) (最大公约数)(译者注:使用辗转相乘法)

使用递归。
基本情况是如果y等于0,则返回x
其它情况下,返回yx/y的最大公约数。

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

Hamming distance (汉明距离)

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

const hammingDistance = (num1, num2) =>
  ((num1 ^ num2).toString(2).match(/1/g) || '').length;
// hammingDistance(2,3) -> 1

Percentile (百分位数)

使用百分比公式计算给定数组中有多少个数小于或等于给定值。
使用Array.reduce()计算值的下面有多少个数是相同的值, 并应用百分比公式。

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

Powerset (幂集)

使用 Array.reduce()Array.map()结合来迭代元素并将其组合成一个包含所有组合的数组。

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

Round number to n digits (取小数点后 n 位)

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

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

Standard deviation (标准差)

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

const standardDeviation = (arr, usePopulation = false) => {
  const mean = arr.reduce((acc, val) => acc + val, 0) / arr.length;
  return Math.sqrt(
    arr.reduce((acc, val) => acc.concat(Math.pow(val - mean, 2)), [])
       .reduce((acc, val) => acc + val, 0) / (arr.length - (usePopulation ? 0 : 1))
  );
};
// standardDeviation([10,2,38,23,38,23,21]) -> 13.284434142114991 (sample)
// standardDeviation([10,2,38,23,38,23,21], true) -> 12.29899614287479 (population)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容