JavaScriptで数値を因数分解する3つの方法

この記事は、Free CodeCampの基本的なアルゴリズムスクリプト「FactorializeaNumber」に基づいています。

数学では、非負の整数nの階乗はトリッキーなアルゴリズムになる可能性があります。この記事では、3つのアプローチについて説明します。最初は再帰関数を使用し、2番目はwhileループを使用し、3番目はforループを使用します。

前回の記事「JavaScriptで文字列を3つの異なる方法で逆にする方法」で、文字列に対する再帰的アプローチをすでに見てきました今回は同じ概念を数に適用します。

アルゴリズムの課題

指定された整数の階乗を返します。

整数が文字nで表される場合、階乗はn以下のすべての正の整数の積です。

階乗は、多くの場合、省略表記nで表されます。

例:5!= 1 * 2 * 3 * 4 * 5 = 120

 function factorialize(num) { return num; } factorialize(5);

提供されたテストケース

  • factorialize(0)は1を返す必要があります
  • factorialize(5)は120を返す必要があります
  • factorialize(10)は3628800を返す必要があります
  • factorialize(20)は2432902008176640000を返す必要があります

数を因数分解することとは何ですか?

数値を因数分解するときは、その数値に連続する各数値から1を引いた値を掛けます。

あなたの番号が5の場合、次のようになります。

5! = 5 * 4 * 3 * 2 * 1

パターンは次のようになります。

0! = 1 1! = 1 2! = 2 * 1 3! = 3 * 2 * 1 4! = 4 * 3 * 2 * 1 5! = 5 * 4 * 3 * 2 * 1

1.再帰を使用して数値を因数分解します

function factorialize(num) { // If the number is less than 0, reject it. if (num < 0) return -1; // If the number is 0, its factorial is 1. else if (num == 0) return 1; // Otherwise, call the recursive procedure again else { return (num * factorialize(num - 1)); /* First Part of the recursion method You need to remember that you won’t have just one call, you’ll have several nested calls Each call: num === "?" num * factorialize(num - 1) 1st call – factorialize(5) will return 5 * factorialize(5 - 1) // factorialize(4) 2nd call – factorialize(4) will return 4 * factorialize(4 - 1) // factorialize(3) 3rd call – factorialize(3) will return 3 * factorialize(3 - 1) // factorialize(2) 4th call – factorialize(2) will return 2 * factorialize(2 - 1) // factorialize(1) 5th call – factorialize(1) will return 1 * factorialize(1 - 1) // factorialize(0) Second part of the recursion method The method hits the if condition, it returns 1 which num will multiply itself with The function will exit with the total value 5th call will return (5 * (5 - 1)) // num = 5 * 4 4th call will return (20 * (4 - 1)) // num = 20 * 3 3rd call will return (60 * (3 - 1)) // num = 60 * 2 2nd call will return (120 * (2 - 1)) // num = 120 * 1 1st call will return (120) // num = 120 If we sum up all the calls in one line, we have (5 * (5 - 1) * (4 - 1) * (3 - 1) * (2 - 1)) = 5 * 4 * 3 * 2 * 1 = 120 */ } } factorialize(5);

コメントを省く:

function factorialize(num) { if (num < 0) return -1; else if (num == 0) return 1; else { return (num * factorialize(num - 1)); } } factorialize(5);

2.WHILEループを使用して数値を因数分解します

function factorialize(num) { // Step 1. Create a variable result to store num var result = num; // If num = 0 OR num = 1, the factorial will return 1 if (num === 0 || num === 1) return 1; // Step 2. Create the WHILE loop while (num > 1) { num--; // decrementation by 1 at each iteration result = result * num; // or result *= num; /* num num-- var result result *= num 1st iteration: 5 4 5 20 = 5 * 4 2nd iteration: 4 3 20 60 = 20 * 3 3rd iteration: 3 2 60 120 = 60 * 2 4th iteration: 2 1 120 120 = 120 * 1 5th iteration: 1 0 120 End of the WHILE loop */ } // Step 3. Return the factorial of the provided integer return result; // 120 } factorialize(5);

コメントを省く:

function factorialize(num) { var result = num; if (num === 0 || num === 1) return 1; while (num > 1) { num--; result *= num; } return result; } factorialize(5);

3.FORループを使用して数値を因数分解します

function factorialize(num) { // If num = 0 OR num = 1, the factorial will return 1 if (num === 0 || num === 1) return 1; // We start the FOR loop with i = 4 // We decrement i after each iteration for (var i = num - 1; i >= 1; i--) { // We store the value of num at each iteration num = num * i; // or num *= i; /* num var i = num - 1 num *= i i-- i >= 1? 1st iteration: 5 4 = 5 - 1 20 = 5 * 4 3 yes 2nd iteration: 20 3 = 4 - 1 60 = 20 * 3 2 yes 3rd iteration: 60 2 = 3 - 1 120 = 60 * 2 1 yes 4th iteration: 120 1 = 2 - 1 120 = 120 * 1 0 no 5th iteration: 120 0 120 End of the FOR loop */ } return num; //120 } factorialize(5);

コメントを省く:

function factorialize(num) { if (num === 0 || num === 1) return 1; for (var i = num - 1; i >= 1; i--) { num *= i; } return num; } factorialize(5);

これがお役に立てば幸いです。これは、Free Code Camp Algorithm Challengesに関する私の「HowtoSolve FCC Algorithms」シリーズの記事の一部です。ここでは、いくつかの解決策を提案し、内部で何が起こっているかを段階的に説明します。

JavaScriptで文字列を繰り返す3つの方法

この記事では、freeCodeCampの「文字列を繰り返す」という課題を解決する方法について説明します。これには…

JavaScriptで文字列の終わりを確認する2つの方法

この記事では、freeCodeCampの「ConfirmtheEnding」チャレンジを解決する方法を説明します。

JavaScriptで文字列を逆にする3つの方法

この記事は、Free CodeCampの基本的なアルゴリズムスクリプト「文字列を逆にする」に基づいています。

JavaScriptでパリンドロームをチェックする2つの方法

この記事は、Free Code Camp Basic AlgorithmScripting「CheckforPalindromes」に基づいています。

Three Ways to Find the Longest Word in a String in JavaScript

This article is based on Free Code Camp Basic Algorithm Scripting “Find the Longest Word in a String”.

Three Ways to Title Case a Sentence in JavaScript

This article is based on Free Code Camp Basic Algorithm Scripting “Title Case a Sentence”.

Three ways you can find the largest number in an array using JavaScript

In this article, I’m going to explain how to solve Free Code Camp’s “Return Largest Numbers in Arrays” challenge. This…

If you have your own solution or any suggestions, share them below in the comments.

Or you can follow me on Medium, Twitter, Github and LinkedIn, right after you click the green heart below ;-)

‪#‎StayCurious‬, ‪#‎KeepOnHacking‬ & ‪#‎MakeItHappen‬!