【JavaScript】数値の各桁を合計し、1桁になるまで再帰的に計算する方法
本記事では、数値を受け取り、その各桁の合計が1桁になるまで再帰的に計算するJavaScript関数の作成方法を解説します。このような操作は「デジタルルート(デジタル根)」とも呼ばれます。
問題の概要
まず、目指す動作を確認しましょう。たとえば次のようなケースです。
findSum(12345) = 1+2+3+4+5 = 15 → 1+5 = 6
この場合、最終的な出力は 6 になります。15という2桁の数に対してもう一度各桁の合計を求めることで、1桁の数に圧縮できているのがポイントです。
findSum() 関数の実装
それでは、再帰を使ってこの処理を実装してみましょう。
// 再帰を使った実装
const findSum = (num) => {
if(num < 10){
return num;
}
const lastDigit = num % 10;
const remainingNum = Math.floor(num / 10);
return findSum(lastDigit + findSum(remainingNum));
}
console.log(findSum(2568));
コードの解説
この関数の仕組みは以下の通りです。
- 引数の数値が10未満であれば、すでに1桁に圧縮済みのため、その値をそのまま返します。
- そうでない場合は、
num % 10で最後の桁(1の位)を取り出します。 Math.floor(num / 10)で残りの桁からなる数値を取得し、その部分に対して再帰的にfindSum()を呼び出します。- 得られた結果と最後の桁を足し合わせ、再度
findSum()に渡すことで、結果が1桁になるまで処理を繰り返します。
実行結果
上記のコードでは、2568 → 2+5+6+8 = 21 → 2+1 = 3 と計算されるため、コンソールには次のように出力されます。
3
補足:デジタルルートの数学的性質
ちなみに、デジタルルートには便利な数学的性質があります。正の整数 n のデジタルルートは、n を9で割った余りと一致します(ただし n が0のときは0、9の倍数のときは9)。これを利用すると、再帰なしで定数時間 O(1) で計算することも可能です。
// 数学的性質を利用した O(1) の実装
const digitalRoot = (num) => {
if (num === 0) return 0;
return 1 + (num - 1) % 9;
}
用途に応じて、再帰によるわかりやすい実装と、この効率的な実装を使い分けるとよいでしょう。
-
C++で数値の桁の合計を1桁になるまで繰り返し求める方法
このチュートリアルでは、与えられた整数の各桁の合計を計算し、その結果が1桁になるまで同じ処理を繰り返すプログラムをC++で作成します。このような演算は「デジタルルート(数字根)」と呼ばれることもあります。 まずは具体的な例を見てみましょう。 入力: 4543 出力: 7 計算の流れは次のとおりです。まず 4 + 5 + 4 + 3 = 16 となり、16はまだ2桁なのでさらに 1 + 6 = 7 を計算します。7は1桁なので、これが最終的な答えになります。 解き方の手順 対象となる数値を用意します。 合計を格納する変数を0で初期化します。 合計が9以下になるまで以下の処理を繰り返します。
-
Pythonで各桁の合計を1桁になるまで繰り返し計算する方法【デジタルルート】
正の整数 n が与えられたとき、そのすべての桁の数字を足し合わせて新しい数を作り、この操作を結果が10未満(1桁)になるまで繰り返すことを考えます。このようにして得られる「1桁に還元された数」はデジタルルート(数根)と呼ばれる有名な概念です。 例えば、入力が 9625 の場合、出力は 4 になります。計算の流れは以下のとおりです。 9 + 6 + 2 + 5 = 22 2 + 2 = 4 解法のアプローチ この問題は、再帰呼び出しを利用すると簡潔に解くことができます。具体的な手順は次のとおりです。 solve() メソッドを定義し、引数として n を受け取る n < 10 の場合、