Три способа факторизации числа в JavaScript

Эта статья основана на сценариях базового алгоритма Free Code Camp «Факторизация числа».

В математике факториал неотрицательного целого числа n может быть сложным алгоритмом. В этой статье я собираюсь объяснить три подхода: первый с рекурсивной функцией, второй с использованием цикла while и третий с использованием цикла for.

Мы уже видели рекурсивный подход к String в предыдущей статье « Как обратить строку в JavaScript тремя разными способами?» На этот раз мы применим ту же концепцию к числу.

Алгоритм Challenge

Верните факториал предоставленного целого числа.

Если целое число представлено буквой 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

В чем суть факторизации числа?

Когда вы факторизуете число, вы умножаете это число на каждое последующее число минус один.

Если ваше число 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);

Надеюсь, вы нашли это полезным. Это часть моей серии статей «Как решать алгоритмы FCC», посвященных проблемам алгоритмов Free Code Camp, где я предлагаю несколько решений и шаг за шагом объясняю, что происходит внутри.

Три способа повторить строку в JavaScript

В этой статье я объясню, как решить задачу freeCodeCamp «Повторить строку, повторить строку». Это включает в себя…

Два способа подтвердить окончание строки в JavaScript

В этой статье я объясню, как решить задачу freeCodeCamp «Подтвердить окончание».

Три способа перевернуть строку в JavaScript

Эта статья основана на сценариях базового алгоритма Free Code Camp «Обратить строку».

Два способа проверки палиндромов в JavaScript

Эта статья основана на сценариях базового алгоритма Free Code Camp «Проверка палиндромов».

Три способа найти самое длинное слово в строке в JavaScript

Эта статья основана на сценариях базового алгоритма Free Code Camp «Найдите самое длинное слово в строке».

Три способа указать заглавие предложения в JavaScript

Эта статья основана на сценариях базового алгоритма Free Code Camp «Заглавный регистр - предложение».

Три способа найти наибольшее число в массиве с помощью JavaScript

В этой статье я собираюсь объяснить, как решить задачу Free Code Camp «Вернуть наибольшие числа в массивах». Этот…

Если у вас есть собственное решение или какие-либо предложения, поделитесь ими ниже в комментариях.

Или вы можете подписаться на меня в Medium , Twitter, Github и LinkedIn сразу после того, как нажмете зеленое сердце ниже ;-)

# StayCurious, # KeepOnHacking и # MakeItHappen!