30-seconds-of-code学习笔记(2

arrayGcd

求最大公约数

const arrayGcd = arr =>{
                    const gcd = (x, y) => !y ? x : gcd(y, x % y);
                    return arr.reduce((a,b) => gcd(a,b));
}
// arrayGcd([1,2,3,4,5]) -> 1
// arrayGcd([4,8,12]) -> 4

常见面试题 上面用的辗转相除法,即相互取余,知道最后一方为0,取另一方。

麻烦点的写法

var arrayGcd = function(arr) {
    function gcd(x, y) {
        return !y ? x : gcd(y, x % y)
    }
    var result = arr[0];
    for(var i = 0, length = arr.length; i < length; i++) {
        result = gcd(result, arr[i])
    }
    return result
}

还有一种方法叫做更相减损法 先两边共同把公约数2除完,然后相减与最小数比较 知道相等 在算出最先出来的2余其乘积

var arrayGcd = function(arr) {
    function gcd(x, y, z = 0) {
        if(!(x % 2 || y % 2)) {
            return gcd(x/2, y/2, z+1)
        }
        return x === y ? x*Math.pow(2, z) : gcd(Math.min(x, y), Math.abs(x - y), z)
    }
    var result = arr[0];
    for(var i = 0, length = arr.length; i < length; i++) {
        result = gcd(result, arr[i])
    }
    return result
}

我们试着让他简化一点

const arrayGcd = (arr) => {
    const gcd = (x, y, z = 1) => x === y ? x * z : x % 2 || y % 2 ? gcd(Math.min(x, y), Math.abs(x - y), z) : gcd(x/2, y/2, z*2)
    return arr.reduce((a,b) => gcd(a,b));
}

嗯··· 还是有点长····

arrayLcm

最小公倍数
应用定理 最大公约数 * 最小公倍数 = 两数乘积

所以

const arrayLcm = arr =>{
                    const gcd = (x, y) => !y ? x : gcd(y, x % y);
                    const lcm = (x, y) => (x*y)/gcd(x, y); 
                    return arr.reduce((a,b) => lcm(a,b));
}

这个就简单了

你可能感兴趣的:(30-seconds-of-code学习笔记(2)