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 = 6recursiveMultiSum(16, 28, 44, 76, 11):合計175 → 1 × 7 × 5 = 35 → 3 × 5 = 15 → 1 × 5 = 5recursiveMultiSum(1, 2, 4, 6, 8):合計21 → 2 × 1 = 2
このように、再帰を組み合わせることで「合計 → 各桁の積 → 1桁化」という処理をシンプルなコードで実現できます。なお、この種の「各桁の積を繰り返し求める」操作は、数学では乗法パーシスタンス(multiplicative persistence)と呼ばれる概念にも関連しており、再帰処理の学習教材としても最適です。
-
JavaScriptで数値の各桁の数字を一つずつ分割表示する方法
はじめに この記事では、ユーザーが入力した数値を検証し、有効な数値であればその各桁の数字を画面に一つずつ表示するJavaScriptプログラムの作り方を解説します。 動作イメージ ページ上のボタンをクリックすると入力ダイアログが開き、そこに数値を入力してOKを押すと、入力された数値の各桁が一行ずつ画面に出力される仕組みです。 例えば、入力が次のような場合—— 43354 画面には次のように表示されます。 4 3 3 5 4 完成コード HTML <!DOCTYPE html> <html> <head> &n
-
【JavaScript】数値の各桁の「和」と「積」の差を求める方法
本記事では、JavaScript を使って、ある数値の各桁の合計(和)と各桁の乗算結果(積)の差を求める方法を解説します。最終的には、その差の絶対値を返す関数を作成します。 課題の内容 数値 n を引数として受け取る JavaScript の関数を作成します。この関数の役割は、次のとおりです。 数値を構成するすべての桁の合計を計算する 数値を構成するすべての桁の積を計算する 両者の差の絶対値を返す 例えば、数値が 434312 の場合、各桁の合計は「4 + 3 + 4 + 3 + 1 + 2 = 17」、各桁の積は「4 × 3 × 4 × 3 × 1 × 2 = 288」となり、差の絶対値