Три способи розкласти число на множники в JavaScript

Ця стаття заснована на сценарії базового алгоритму табору Free Code Camp “Розділення числа на факториали”

У математиці факторіал невід'ємного цілого числа n може бути хитрим алгоритмом. У цій статті я збираюся пояснити три підходи, спочатку з рекурсивною функцією, другий за допомогою циклу while і третій за допомогою циклу for.

Ми вже бачили рекурсійний підхід до рядка в попередній статті " Як змінити рядок у JavaScript у 3 різні способи?" Цього разу ми застосуємо те саме поняття до числа.

Виклик алгоритму

Повернути факторіал наданого цілого числа.

Якщо ціле число представлено літерою n, факторіал є добутком усіх додатних цілих чисел, менших або рівних n.

Розділювачі часто представлені скороченим позначенням n!

Наприклад: 5! = 1 * 2 * 3 * 4 * 5 = 120

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

Надані тестові кейси

  • factorialize (0) повинен повернути 1
  • розкласти на факторіали (5) слід повернути 120
  • розкласти на факторіали (10) слід повернути 3628800
  • розкласти на факторіали (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” про виклики, пов’язані з алгоритмом табору вільного коду, де я пропоную кілька рішень і покроково пояснюю, що відбувається під капотом.

Три способи повторити рядок у JavaScript

У цій статті я розтлумачу, як вирішити завдання freeCodeCamp "Повторити рядок, повторити рядок". Це передбачає ...

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

У цій статті я поясню, як вирішити проблему freeCodeCamp "Підтвердити закінчення".

Три способи змінити рядок у JavaScript

Ця стаття заснована на сценарії базового алгоритму табору Free Code Camp «Зворот рядка»

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

Ця стаття заснована на сценарії базового алгоритму табору Free Code Camp «Перевірка паліндромів».

Три способи знайти найдовше слово в рядку в JavaScript

Ця стаття заснована на сценарії базового алгоритму табору Free Code Camp «Знайди найдовше слово в рядку».

Три способи озаглавити речення у JavaScript

Ця стаття заснована на сценарії базового алгоритму табору Free Code Camp “Заголовок - вирок”.

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

У цій статті я збираюся пояснити, як вирішити проблему Free Return Camp “Повернути найбільші цифри в масиви”. Це ...

Якщо у вас є власне рішення чи будь-які пропозиції, поділіться ними нижче в коментарях.

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

# Будьте цікаві, # KeepOnHacking & # MakeItHappen!