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

JavaScriptで合計値の各桁の積を再帰的に求める方法

問題の概要

今回は、任意の個数の引数(数値リテラル)を受け取り、それらを合計したうえで、結果が1桁の数値になるまで各桁の数字を掛け合わせて返す関数をJavaScriptで作成します。

具体例

たとえば、引数として次の3つの数値が渡されたとしましょう。

16, 34, 42

まず、すべての引数を足し合わせます。

16 + 34 + 42 = 92

次に、1桁の数値になるまで、桁ごとの数字を掛け合わせていきます。

9 × 2 = 18
1 × 8 = 8

1桁の数値「8」が得られたので、この値を関数の戻り値として返します。このような多段階の変換処理は、再帰(recursion)を使うと簡潔に実装できます。

実装の方針

今回の機能は、役割の異なる2つの関数に分けて実装します。

  • produce()関数:1つの数値を受け取り、その各桁の積を再帰処理によって計算して返します。
  • recursiveMultiSum()関数:引数の合計を求めてproduce()を呼び出し、結果が1桁ならその値を返します。2桁以上の場合は、自分自身を再帰的に呼び出して処理を繰り返します。

コード例

const recursiveMultiSum = (...numbers) => {
    const add = (a) => a.length === 1 ? a[0] : a.reduce((acc, val) => acc + val);
    const produce = (n, p = 1) => {
        if(n){
            return produce(Math.floor(n / 10), p * (n % 10));
        };
        return p;
    };
    const res = produce(add(numbers));
    if(res > 9){
        return recursiveMultiSum(res);
    }
    return res;
};
console.log(recursiveMultiSum(16, 28));
console.log(recursiveMultiSum(16, 28, 44, 76, 11));
console.log(recursiveMultiSum(1, 2, 4, 6, 8));

コードのポイント

  • add():可変長引数として受け取った数値の合計をreduce()で計算します。要素が1つだけの場合は、その値をそのまま返します。
  • produce():数値nを10で割った商と余りを利用しながら再帰呼び出しを行い、各桁の数字を累積変数pに掛けていきます。nが0になった時点でpを返します。
  • recursiveMultiSum():合計値の各桁の積が9より大きい(2桁以上)場合は自分自身を再帰的に呼び出し、1桁になるまで処理を繰り返します。

実行結果

コンソールには次のように出力されます。

6
5
2

それぞれの呼び出しの流れを確認してみましょう。

  • recursiveMultiSum(16, 28):16 + 28 = 44 → 4 × 4 = 16 → 1 × 6 = 6
  • recursiveMultiSum(16, 28, 44, 76, 11):合計175 → 1 × 7 × 5 = 35 → 3 × 5 = 15 → 1 × 5 = 5
  • recursiveMultiSum(1, 2, 4, 6, 8):合計21 → 2 × 1 = 2

このように、再帰を組み合わせることで「合計 → 各桁の積 → 1桁化」という処理をシンプルなコードで実現できます。なお、この種の「各桁の積を繰り返し求める」操作は、数学では乗法パーシスタンス(multiplicative persistence)と呼ばれる概念にも関連しており、再帰処理の学習教材としても最適です。

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

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

  2. 【JavaScript】数値の各桁の「和」と「積」の差を求める方法

    本記事では、JavaScript を使って、ある数値の各桁の合計(和)と各桁の乗算結果(積)の差を求める方法を解説します。最終的には、その差の絶対値を返す関数を作成します。 課題の内容 数値 n を引数として受け取る JavaScript の関数を作成します。この関数の役割は、次のとおりです。 数値を構成するすべての桁の合計を計算する 数値を構成するすべての桁の積を計算する 両者の差の絶対値を返す 例えば、数値が 434312 の場合、各桁の合計は「4 + 3 + 4 + 3 + 1 + 2 = 17」、各桁の積は「4 × 3 × 4 × 3 × 1 × 2 = 288」となり、差の絶対値