JavaScriptで数字根(デジタルルート)に基づく配列ソートアルゴリズムを実装する方法
デジタルルート(数字根)とは
デジタルルート(数字根)とは、ある正の整数を構成するすべての桁の数字を合計した値として定義されます。本記事では、整数の配列が与えられたときに、「a の数字根が b の数字根以下であれば a を b より前に配置する」というルールで配列を並べ替えるアルゴリズムを JavaScript で実装します。
ソートのルール
同じ数字根を持つ2つの数が存在する場合は、通常の大小関係において小さい方を先に配置します。たとえば、4 と 13 はどちらも数字根が 4 で等しいですが、4 < 13 であるため、両方が含まれる配列では常に 4 が 13 より先に来ます。
具体例
const a = [13, 20, 7, 4] の場合、 出力は [20, 4, 13, 7] になります。
それぞれの数字根を確認すると、20 → 2、4 → 4、13 → 4、7 → 7 となっており、数字根の昇順に、同値の場合は元の数値の昇順で並んでいることがわかります。
実装の方針
この問題は、次の2つの関数に分割して実装します。
- 再帰関数:数値の各桁の合計(数字根)を計算する
- 比較関数:桁の合計に基づいて要素の順序を決定する
サンプルコード
const arr = [54, 23, 8, 89, 26];
const recursiveCount = (num, count = 0) => {
if(num){
return recursiveCount(Math.floor(num/10), count+num%10);
};
return count;
};
const sorter = (a, b) => {
const countDifference = recursiveCount(a) - recursiveCount(b);
return countDifference || a - b;
};
arr.sort(sorter);
console.log(arr);
コードの解説
recursiveCount 関数は、引数 num が 0 になるまで自分自身を再帰的に呼び出し、各ステップで num % 10(最下位の桁)を累積加算していきます。これにより、数値全体の桁和を効率的に求められます。
sorter 関数は、Array.prototype.sort() の比較関数として機能します。2つの数の数字根の差を計算し、差が 0(数字根が等しい)の場合は a - b によって通常の数値順で並べ替えます。countDifference || a - b という記述は、差が非ゼロならその値を返し、ゼロなら後者の式の結果を返す短絡評価を利用した簡潔なテクニックです。
実行結果
コンソールには以下のように出力されます。
[ 23, 8, 26, 54, 89 ]
各数値の数字根を確認すると、23 → 5、8 → 8、26 → 8、54 → 9、89 → 17 となっており、数字根の昇順に正しく並べ替えられていることがわかります。また、数字根が同じ 8 と 26 については、小さい方の 8 が先に配置されています。
-
JavaScriptのsort()メソッドとは?配列ソートの基本と比較関数の使い方を解説
JavaScriptのsort()メソッドは、配列の要素を並べ替えるための組み込みメソッドです。アルファベット順・数値順といった並べ替えの基準に加え、昇順・降順も自由に指定できます。デフォルトでは要素が文字列として比較され昇順にソートされますが、比較関数を渡すことで任意の順序を実現できます。 なお、sort()は元の配列そのものを変更する「破壊的メソッド」である点にも注意しましょう。元の配列を保持したい場合は、スプレッド構文([...arr])などで事前にコピーしておくのが安全です。 コード例 以下は、sort()メソッドを使って配列をソートするシンプルなサンプルコードです。 <!DO
-
JavaScriptのArray.prototype.sort()メソッドの使い方をサンプルコードで解説
Array.prototype.sort()は、JavaScriptで配列の要素を並べ替えるための組み込みメソッドです。アルファベット順・数値順といった並び方に加えて、昇順・降順も自由に指定でき、配列操作の中でも特に使用頻度の高いメソッドの一つです。 ただし重要なポイントとして、sort()メソッドはデフォルトではすべての要素を文字列に変換してから比較します。そのため、数値の配列を意図したとおりに並べ替えたい場合は、比較関数を引数として渡す必要があります。 以下は、Array.prototype.sort()メソッドの基本的な使い方を示すサンプルコードです。 サンプルコード <!DOC