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

JavaScriptで桁の合計を再帰的に1桁の数字に減らす方法

数値を受け取り、その各位の数字を合計し、結果が1桁になるまでこの操作を繰り返し、最終的な1桁の数値を返す関数を作成する必要があります。

このような処理は「デジタルルート(Digital Root)」と呼ばれることもあります。例えば 88 の場合は 8 + 8 = 16、さらに 1 + 6 = 7 となり、最終的に 7 を返します。

実装方法は非常にシンプルです。再帰関数を使って、数値が9より大きい(または負の数の場合は-9より小さい)間は各位の数字の合計を求める処理を繰り返します。符号の扱いについてはロジックを二度書かなくて済むよう、別途管理する設計にしています。

コード例

const sumRecursively = (n, isNegative = n < 0) => {
    n = Math.abs(n);
    if(n > 9){
        return sumRecursively(parseInt(String(n).split("").reduce((acc,val) => {
            return acc + +val;
        }, 0)), isNegative);
    }
    return !isNegative ? n : n*-1;
};
console.log(sumRecursively(88));
console.log(sumRecursively(18));
console.log(sumRecursively(-345));
console.log(sumRecursively(6565));

コードの解説

  • 第2引数 isNegative で元の数値が負かどうかを記録しておきます。デフォルト値として n < 0 の判定結果を利用することで、呼び出し側は引数を省略できます。
  • Math.abs(n) で絶対値に変換し、以降の処理では正の数として扱います。
  • n > 9 の場合(つまり2桁以上の場合)は、String(n).split("") で文字列にして1文字ずつ分解し、reduce() で各桁を合計します。+val により文字列を数値に変換している点に注目してください。
  • 合計した数値を引数として自分自身を再帰呼び出しし、1桁になるまで処理を繰り返します。
  • 最後に、isNegativetrue であれば -1 を掛けて符号を復元して返します。

出力結果

コンソールへの出力は以下のようになります。

7
9
-3
4

それぞれ 88 → 16 → 718 → 9-345 → 12 → 3 → -36565 → 22 → 4 と計算されていることが確認できます。


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

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

  2. JavaScriptで数値の階乗の桁数を求める方法

    問題JavaScriptで、数値 num を唯一の引数として受け取る関数を作成することを考えます。この関数は、num の階乗(n!)が何桁になるかを計算し、その桁数を返す必要があります。たとえば、関数への入力が次のような場合を考えてみましょう。入力const num = 7;出力const output = 4;出力の解説7! = 5040 であり、5040は4桁の数字であるため、結果は 4 となります。アプローチ:対数を使った賢い計算方法一見すると、階乗を直接計算して文字列の長さを数えればよさそうに思えます。しかし、階乗は極めて急激に増加するため、少し大きな数でもすぐにJavaScriptの