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桁になるまで処理を繰り返します。
- 最後に、
isNegativeがtrueであれば-1を掛けて符号を復元して返します。
出力結果
コンソールへの出力は以下のようになります。
7 9 -3 4
それぞれ 88 → 16 → 7、18 → 9、-345 → 12 → 3 → -3、6565 → 22 → 4 と計算されていることが確認できます。
-
JavaScriptで数値の各桁の数字を一つずつ分割表示する方法
はじめに この記事では、ユーザーが入力した数値を検証し、有効な数値であればその各桁の数字を画面に一つずつ表示するJavaScriptプログラムの作り方を解説します。 動作イメージ ページ上のボタンをクリックすると入力ダイアログが開き、そこに数値を入力してOKを押すと、入力された数値の各桁が一行ずつ画面に出力される仕組みです。 例えば、入力が次のような場合—— 43354 画面には次のように表示されます。 4 3 3 5 4 完成コード HTML <!DOCTYPE html> <html> <head> &n
-
JavaScriptで数値の階乗の桁数を求める方法
問題JavaScriptで、数値 num を唯一の引数として受け取る関数を作成することを考えます。この関数は、num の階乗(n!)が何桁になるかを計算し、その桁数を返す必要があります。たとえば、関数への入力が次のような場合を考えてみましょう。入力const num = 7;出力const output = 4;出力の解説7! = 5040 であり、5040は4桁の数字であるため、結果は 4 となります。アプローチ:対数を使った賢い計算方法一見すると、階乗を直接計算して文字列の長さを数えればよさそうに思えます。しかし、階乗は極めて急激に増加するため、少し大きな数でもすぐにJavaScriptの