JavaScriptでトリボナッチ数列を生成する方法
トリボナッチ数列とは?
トリボナッチ数列は、フィボナッチ数列を一般化した数列です。フィボナッチ数列では各項が「直前の2項の和」になるのに対し、トリボナッチ数列では各項が「直前の3項の和」になります。
トリボナッチ数列の最初のいくつかの項は以下のとおりです。
0, 1, 1, 2, 4, 7, 13, 24, 44, 81, 149
たとえば7番目の項「13」は、直前の3項である「2」「4」「7」を足した値(2 + 4 + 7 = 13)に一致します。
作成する関数の仕様
ここでは、数値 num を唯一の引数として受け取り、トリボナッチ数列の最初の num 個の項を要素にもつ配列を返すJavaScript関数を実装します。
たとえば f(6) を呼び出した場合、戻り値は最初の6項を並べた [0, 1, 1, 2, 4, 7] となります。
コード例
以下がその実装コードです。
const tribonacci = (num = 1) => {
if (num === 1) {
return 0;
}
if (num === 2 || num === 3) {
return 1;
} else {
return tribonacci(num - 1) +
tribonacci(num - 2) +
tribonacci(num - 3);
}
};
const trib = num => {
const res = [];
for (let i = 1; i <= num; i++) {
res.push(tribonacci(i));
}
return res;
};
console.log(trib(11));実行結果
コンソールには次のように出力されます。
[ 0, 1, 1, 2, 4, 7, 13, 24, 44, 81, 149 ]
補足:メモ化による高速化
上記の素朴な再帰実装では、同じ値を何度も計算し直すため、num が大きくなると計算量が指数関数的に増加します。計算結果をキャッシュする「メモ化」を導入すると、計算量を O(n) まで抑えることができます。
const memo = {};
const tribonacci = (num = 1) => {
if (memo[num] !== undefined) return memo[num];
let result;
if (num === 1) {
result = 0;
} else if (num === 2 || num === 3) {
result = 1;
} else {
result = tribonacci(num - 1) +
tribonacci(num - 2) +
tribonacci(num - 3);
}
memo[num] = result;
return result;
};このように、トリボナッチ数列はフィボナッチ数列とほぼ同じ要領で実装でき、「ベースケース(初期条件)の数だけ異なる」という点が実装時のポイントになります。
-
JavaScriptで1からnまでの自然数の総和を求める関数を実装する方法
問題数値 n を引数として受け取る JavaScript の関数を作成する必要があります。この関数は、1 から n までのすべての自然数(1 と n そのものを含む)の合計を返すものとします。解決アプローチ最もシンプルな方法は、for ループを使って 1 から n までの数値を順番に加算していくことです。変数で合計値を保持し、ループが終わった時点でその値を返します。コード例以下が実際のコードです。const num = 34; const summation = (num = 1) => { let res = 0; for(let i
-
JavaScriptで数値に序数接尾辞(st・nd・rd・th)を追加する方法
問題JavaScriptで関数を作成する必要があります。この関数は、数値 num を最初の(唯一の)引数として受け取ります。関数の役割は、英語の序数表記のルールに従って、数値に「st」「nd」「rd」「th」という接尾辞を追加することです。具体的なルールは以下の通りです。一の位が1で終わる数値には「st」を使用します(例:1st、発音はfirst)一の位が2で終わる数値には「nd」を使用します(例:92nd、発音はninety-second)一の位が3で終わる数値には「rd」を使用します(例:33rd、発音はthirty-third)上記ルールの例外として、下二桁が11・12・13となる数値に