はじめに
私は現在Recursionという学習サービスでコンピュータサイエンスの勉強をしています。
Recursionは随時学んだことをアウトプットできるように様々なコーディング問題が用意されています。
コーディング問題を解く上で心掛けていたこと
問題の解き方は複数ありますが、これまでなるべく学んだ中での最適なコードで解くように心がけてきました。
例えば、計算量について学んだカリキュラムでは計算量を意識して問題を解いたり、紙にプログラムの動きを書いて問題を解いたりもしました!
例(再帰と末尾再帰)
// 再帰
function simpleSummation(n) {
if (n <= 0) {
return 0;
}
return simpleSummation(n-1) + n;
}
-----------------------------------------------------------------
// 末尾再帰
function simpleSummationTail(n) {
return simpleSummationTailHelper(n,0);
}
//ヘルパー関数
function simpleSummationTailHelper(count,total) {
//ベースケースに達したら、計算結果を返す
if (count <= 0) {
return total;
}
//total + count として、計算結果を足していく。
return simpleSummationTailHelper(count-1,total+count);
}
-----------------------------------------------------------------
console.log(simpleSummation(5)); //---15
console.log(simpleSummationTail(5)); //---15
この二つの関数は同じ出力結果ですが、計算量が違います。
これはJavascriptを含む一部の言語で末尾呼び出し最適化というものです。この技術は、スタックの消費を抑えるために、コンパイラが最適化を行います。
つまり、空間計算量がO(n)からO(1)になり、圧倒的に削減できます!!
さいごに
カリキュラム一周目では生成AIにもたくさん頼ってしまって、まったくコーディング問題が解けなかったのですが、二周目はAIに頼らず、地道に問題を解いていったらプログラムの動きを正しく追えるようになって様々なコードを思いつけるようになりました!!