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

JavaScriptでウラム数列(コラッツ数列)を生成する方法を解説

ウラム数列とは?

数学者のウラム(Ulam)は、任意の正の整数 n(n > 0)から出発して、次のルールに従って数列を生成する方法を提案しました。なお、この数列は「コラッツ数列」や「角谷の問題」として知られるものと同じ規則に基づいています。

n が 1 なら、処理を終了する。
n が偶数なら、次の数は n / 2。
n が奇数なら、次の数は 3 * n + 1。
1 に到達するまでこの処理を繰り返す。

最初のいくつかの整数について、実際に数列を生成した例がこちらです。

2 -> 1
3 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1
4 -> 2 -> 1
6 -> 3 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1
7 -> 22 -> 11 -> 34 -> 17 -> 52 -> 26 -> 13 -> 40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1

それでは、数値を1つ受け取り、その数から始まるウラム数列を返すJavaScript関数を作成していきましょう。

サンプルコード

実際のコードは次のようになります。

const num = 7;

const generateUlam = num => {
  const res = [num];
  // 正の有限数であるかをチェック
  if (num && num === Math.abs(num) && isFinite(num)) {
    while (num !== 1) {
      if (num % 2) {
        // 奇数の場合:3n + 1
        num = 3 * num + 1;
      } else {
        // 偶数の場合:n / 2
        num /= 2;
      }
      res.push(num);
    }
  } else {
    // 不正な入力の場合は false を返す
    return false;
  }
  return res;
};

console.log(generateUlam(num));
console.log(generateUlam(3));

実行結果

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

[
  7, 22, 11, 34, 17, 52, 26,
  13, 40, 20, 10, 5, 16, 8,
  4, 2, 1
]
[
  3, 10, 5, 16,
  8, 4, 2, 1
]

コードの解説

この関数の仕組みを順番に見ていきましょう。

1. 入力値のバリデーション: まず、引数が有効な正の有限数であるかを num === Math.abs(num)(負でないこと)と isFinite(num)(有限の数値であること)で確認しています。無効な入力の場合は false を返して処理を中断します。

2. 数列の生成: while ループの中で、現在の数値が奇数か偶数かを num % 2 で判定します。奇数なら 3 * num + 1、偶数なら num / 2 を計算し、その結果を配列 res に追加していきます。

3. 終了条件: 数値が 1 になった時点でループが終了し、最初の数から 1 までの完全な数列が返されます。

このように、シンプルな条件分岐とループを組み合わせるだけで、ウラム数列を簡単に生成できることがわかります。

  1. 【JavaScript】数値の約数をすべて求める関数の実装方法

    はじめに本記事では、正の整数を1つ引数として受け取り、その数を余りなく割り切れるすべての数(約数)を配列として返すJavaScript関数の実装方法を解説します。問題の定義作成する関数は、正の整数を唯一の引数として受け取ります。そして、入力された数値を完全に割り切れるすべての数値を要素とする配列を構築して返す必要があります。例えばー入力が次の数値だった場合:const num = 12;期待される出力は以下のとおりです。const output = [1, 2, 3, 4, 6, 12];12の場合、1・2・3・4・6・12の6つの整数が12を割り切れるため、これらが約数となります。実装コード

  2. JavaScriptで数値を回文にするまでのステップ数を求める方法

    問題数値 num を第一かつ唯一の引数として受け取るJavaScript関数を作成します。この関数は、与えられた数値を回文(左から読んでも右から読んでも同じ並びになる数)にするために必要な「特別なステップ」の回数を返します。ここでいう特別なステップとは、「桁を逆順に並べ替えて、元の数値に加算する」という操作のことです。加算した結果がまだ回文になっていない場合は、その合計値に対して同じ操作を、回文が得られるまで繰り返します。例えば、関数への入力が次の場合を考えてみましょう。入力const num = 87;出力const output = 4;出力の解説答えが4になるのは、以下のステップを経るた