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

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

桁数の多い巨大な数値を扱う場合でも、この方法なら効率的に計算できるため、用途に応じて使い分けるとよいでしょう。

  1. JavaScriptで数値の各桁の数字を一つずつ分割表示する方法

    はじめに この記事では、ユーザーが入力した数値を検証し、有効な数値であればその各桁の数字を画面に一つずつ表示するJavaScriptプログラムの作り方を解説します。 動作イメージ ページ上のボタンをクリックすると入力ダイアログが開き、そこに数値を入力してOKを押すと、入力された数値の各桁が一行ずつ画面に出力される仕組みです。 例えば、入力が次のような場合—— 43354 画面には次のように表示されます。 4 3 3 5 4 完成コード HTML <!DOCTYPE html> <html>   <head>   &n

  2. JavaScriptで単調増加する桁を持つ、指定した数以下の最大の数を求める方法

    単調増加する桁(Monotonically Increasing Digits)とは 整数が「単調増加する桁」を持つとは、隣り合う任意の2つの桁 x と y の間に、常に x <= y が成り立つことを指します。たとえば 1234 や 2299 は左から右へ向かって桁が増加(または同じ)ため条件を満たしますが、332 のように「3 → 3 → 2」と減少が含まれる数は単調増加とはみなされません。 問題 今回求められているのは、数値 num を第一引数(かつ唯一の引数)として受け取るJavaScript関数を記述することです。 この関数は、num 以下の数の中から、単調増加する桁を持つ