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
。
其它情况,则返回 n
和n-1
的阶乘的积。
const factorial = n => n <= 1 ? 1 : n * factorial(n - 1);
// factorial(6) -> 720
Fibonacci array generator (斐波纳契数组生成器)
创建一个指定长度的空数组,初始化前两个值(0
和1
)。
使用 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
。
其它情况下,返回y
与 x/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)