JavaScriptで一桁になるまで数値の各桁を再帰的に加算する方法
本記事では、与えられた数値の各桁を合計し、その結果が一桁になるまで再帰的に同じ操作を繰り返すJavaScript関数の実装方法を解説します。
たとえば、数値が 54563 の場合、出力は 5 になります。計算の流れは次のとおりです。
= 5 + 4 + 5 + 6 + 3 = 23 = 2 + 3 = 5
コード例
実際のコードは以下のとおりです。
const num = 54563;
// 一桁になるまで各桁を再帰的に加算する関数
const addRecursively = num => {
if(num < 10){
return num; // 終了条件:一桁ならそのまま返す
}
let sum = 0;
while(num !== 0) {
sum += (num % 10); // 一の位を取り出して加算
num = parseInt(num / 10); // 一の位を削除
}
// 合計がまだ二桁以上なら再帰呼び出し
return addRecursively(sum);
};
console.log(addRecursively(num));出力結果
コンソールには次のように表示されます。
5
コードの仕組み
1. 終了条件のチェック
最初に、引数 num が10未満(つまり一桁)かどうかを確認します。一桁であればそれ以上分解できないため、その値をそのまま返します。ここが再帰処理の出口となる重要なポイントです。
2. 各桁の抽出と合計
while ループの中では、「num % 10」によって一の位の数字を取り出して sum に加算し、「parseInt(num / 10)」で一の位を切り捨てています。この処理を繰り返すことで、数値を右端から順番に一桁ずつ処理できます。
3. 再帰呼び出し
得られた合計 sum がまだ二桁以上の場合は、その値を引数として関数自身を再度呼び出します。結果が一桁になるまでこの処理が繰り返され、最終的に一桁の値が返されます。
補足:デジタルルートによる高速化
この一連の操作は、数学では「デジタルルート(digital root)」として知られています。実は、9の剰余の性質を利用すると、再帰やループを使わずに定数時間 O(1) で求めることも可能です。
// 正の整数 n のデジタルルートを O(1) で求める const digitalRoot = n => n === 0 ? 0 : 1 + (n - 1) % 9; console.log(digitalRoot(54563)); // 5
桁数の多い巨大な数値を扱う場合でも、この方法なら効率的に計算できるため、用途に応じて使い分けるとよいでしょう。
-
JavaScriptで数値の各桁の数字を一つずつ分割表示する方法
はじめに この記事では、ユーザーが入力した数値を検証し、有効な数値であればその各桁の数字を画面に一つずつ表示するJavaScriptプログラムの作り方を解説します。 動作イメージ ページ上のボタンをクリックすると入力ダイアログが開き、そこに数値を入力してOKを押すと、入力された数値の各桁が一行ずつ画面に出力される仕組みです。 例えば、入力が次のような場合—— 43354 画面には次のように表示されます。 4 3 3 5 4 完成コード HTML <!DOCTYPE html> <html> <head> &n
-
JavaScriptで単調増加する桁を持つ、指定した数以下の最大の数を求める方法
単調増加する桁(Monotonically Increasing Digits)とは 整数が「単調増加する桁」を持つとは、隣り合う任意の2つの桁 x と y の間に、常に x <= y が成り立つことを指します。たとえば 1234 や 2299 は左から右へ向かって桁が増加(または同じ)ため条件を満たしますが、332 のように「3 → 3 → 2」と減少が含まれる数は単調増加とはみなされません。 問題 今回求められているのは、数値 num を第一引数(かつ唯一の引数)として受け取るJavaScript関数を記述することです。 この関数は、num 以下の数の中から、単調増加する桁を持つ