saoriri備忘録

tech とか コードについてとか色々

再帰関数の理解を深める!

再帰関数への苦手意識

私、前々から再帰関数への苦手意識がありました。。。
(業務でもあまり使わないしなーと、ついつい理解を後回しにしていました。もごもご)
しかし競技プログラミングなんか見てみると頻出頻度が高いので、この際理解を深めようと思いました。

やりたい内容

▶︎0からnまで、以下のルールに則った総和であるresultを返す。
奇数の場合は、前の値を*2する。
偶数の場合は、前の値を+1する。
n=0の場合は、1を返す。


例)n:0〜6 ⇨ result:1, 2, 3, 6, 7, 14, 15
n=0の時result=1、n=1の時1*2でresult=2、
n=2の時2+1でresult=3、n=3の時3*2でresult=6、
n=4の時6+1でresult=7となる。

再帰関数を用いたパターン①と、理解を深める為にfor文で単純にループを回すパターン②と2つのパターンを書いてみました。

// ①再帰
let recursive = (n) => {
    if(n==0) return 1;
    return (n%2==1) ? recursive(n-1)*2 : recursive(n-1)+1; 
}

(() => {
    const n = 5;
    console.log(recursive(n)); // 14
})();
// ②再帰使わない
let recursive = (n) => {
    let result = 1;
    for (let i=0; i<=n; i++) {
        if (i==0) continue; 
        if (i%2==1) result *= 2;
        if (i%2==0) result += 1;
    }
     return result; 
}

(() => {
    const n = 5;
    console.log(recursive(n)); // 14
})();

終わりに

これからも引き続き再帰の概念を学んで行きます。。。
今回勉強する上でイメージがとても分かりやすかったサイトを載せます。感謝。

再帰関数を学ぶと、どんな世界が広がるか - Qiita