素因数分解

素因数分解についてのお勉強

forと再帰を使って

const sbk = (num,arr=[]) => {
    let chk = 0;
    for (i of [...Array(num).keys()].slice(2,)){
        if (num % i ===0){
            chk=i;
            break;
        }
    }
    return chk > 0 ? sbk(num/chk,[...arr,chk]) : [...arr,num];

}

引数numを受け取って、2 ~ num-1の数だけfor文を回す。
割り切れる数があったらbreak。そんで再帰処理。
なかったらnumは素数なので再帰終わり。
[2,3~]の配列を作るとき、filter(i>=i>=2)は気持ち悪いからsliceにしてみた。

filterを使って

const sbk = (num,arr=[]) => {
    const chk = [...Array(num).keys()].slice(2,).filter(i=>num % i===0);
    return chk.length > 0 ? sbk(num/chk[0],[...arr,chk[0]]) : [...arr,num];
}

forで文回してた所を、filterにしてみました。
やってることは同じ。こっちの方がbreakしない分効率は良くない。

素数判定をして

const sbk = (num) => {
    let arr = [];
    while(!sosuu(num)){
        const chk = [...Array(num).keys()].slice(2,).filter(i=>num % i===0);
        arr = [...arr,chk[0]];
        num = num / chk[0];
    }
    return [...arr,num];
}

素数判定がtrueになるまでwhileで回し続ける。
最後に分解してきた配列に素数を足して終わり。
こっちの方が再帰じゃない分わかりやすかも?

終わり!2行でかけたときはちょっと感動した。