JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

【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;
}

用途に応じて、再帰によるわかりやすい実装と、この効率的な実装を使い分けるとよいでしょう。


  1. C++で数値の桁の合計を1桁になるまで繰り返し求める方法

    このチュートリアルでは、与えられた整数の各桁の合計を計算し、その結果が1桁になるまで同じ処理を繰り返すプログラムをC++で作成します。このような演算は「デジタルルート(数字根)」と呼ばれることもあります。 まずは具体的な例を見てみましょう。 入力: 4543 出力: 7 計算の流れは次のとおりです。まず 4 + 5 + 4 + 3 = 16 となり、16はまだ2桁なのでさらに 1 + 6 = 7 を計算します。7は1桁なので、これが最終的な答えになります。 解き方の手順 対象となる数値を用意します。 合計を格納する変数を0で初期化します。 合計が9以下になるまで以下の処理を繰り返します。

  2. Pythonで各桁の合計を1桁になるまで繰り返し計算する方法【デジタルルート】

    正の整数 n が与えられたとき、そのすべての桁の数字を足し合わせて新しい数を作り、この操作を結果が10未満(1桁)になるまで繰り返すことを考えます。このようにして得られる「1桁に還元された数」はデジタルルート(数根)と呼ばれる有名な概念です。 例えば、入力が 9625 の場合、出力は 4 になります。計算の流れは以下のとおりです。 9 + 6 + 2 + 5 = 22 2 + 2 = 4 解法のアプローチ この問題は、再帰呼び出しを利用すると簡潔に解くことができます。具体的な手順は次のとおりです。 solve() メソッドを定義し、引数として n を受け取る n < 10 の場合、