Menu
Coddy logo textTech

Рекурсивная функция: факториал

Часть раздела Логика и управление потоком путешествия по Dart на Coddy — урок 49 из 65.

Факториал числа — это классическая математическая операция, которая идеально подходит для демонстрации рекурсии. Факториал положительного целого числа n (записывается как n!) — это произведение всех положительных целых чисел от 1 до n. Например, 5! = 5 × 4 × 3 × 2 × 1 = 120.

Что делает факториал идеальным для рекурсии, так это то, что он естественным образом разбивается на более мелкие, идентичные задачи. Чтобы вычислить 5!, вы можете представить это как 5 × 4!. А 4! — это просто 4 × 3!, и так далее. Этот паттерн продолжается до тех пор, пока вы не дойдете до 1!, который равен 1.

int factorial(int n) {
  if (n <= 1) {
    return 1; // Базовый случай
  }
  
  return n * factorial(n - 1); // Рекурсивный шаг
}

Базовый случай останавливает рекурсию, когда n <= 1, возвращая 1. Рекурсивный шаг умножает текущее число на факториал следующего меньшего числа. Когда вы вызываете factorial(5), он возвращает 5 * factorial(4), который возвращает 5 * 4 * factorial(3), и так далее, пока не будет достигнут базовый случай.

Этот подход демонстрирует, как рекурсия элегантно решает задачи, сводя их к более простым версиям той же задачи, что делает сложные вычисления естественными и интуитивно понятными.

challenge icon

Задание

Легко

Создайте программу, которая вычисляет факториалы для нескольких чисел с использованием рекурсии. Ваша программа продемонстрирует работу рекурсивной функции факториала, обрабатывая список чисел и вычисляя их факториалы.

  1. Прочитайте строковый ввод, содержащий числа, разделенные запятыми (например, "3,5,0,7")
  2. Разделите входную строку на отдельные числа и преобразуйте каждое в целое число
  3. Создайте рекурсивную функцию с именем factorial, которая принимает целочисленный параметр n
  4. Функция factorial должна реализовывать следующую логику:
    • Базовый случай: Если n меньше или равно 1, вернуть 1
    • Рекурсивный шаг: Вернуть n, умноженное на factorial(n - 1)
  5. Для каждого числа во входном списке вычислите его факториал, используя вашу рекурсивную функцию
  6. Отобразите результаты, показывая каждое число и соответствующий ему факториал
  7. Вычислите и отобразите сумму всех результатов факториалов

Например, если на входе "4,3,2", ваша программа должна вывести:

Factorial Calculator
====================
Processing numbers: [4, 3, 2]
====================
Factorial Results:
4! = 24
3! = 6
2! = 2
====================
Sum of all factorials: 32
Calculation completed successfully

Если на входе "5,0,1", ваша программа должна вывести:

Factorial Calculator
====================
Processing numbers: [5, 0, 1]
====================
Factorial Results:
5! = 120
0! = 1
1! = 1
====================
Sum of all factorials: 122
Calculation completed successfully

Если на входе "6", ваша программа должна вывести:

Factorial Calculator
====================
Processing numbers: [6]
====================
Factorial Results:
6! = 720
====================
Sum of all factorials: 720
Calculation completed successfully

Ваша программа должна реализовывать рекурсивную функцию factorial, которая вызывает саму себя с уменьшенными значениями до тех пор, пока не достигнет базового случая. Функция должна демонстрировать, как рекурсия разбивает вычисление факториала на более мелкие, идентичные подзадачи. Используйте интерполяцию строк для форматирования результатов факториала в виде "$n! = $result". Помните, что 0! равен 1 по математическому определению, что ваш базовый случай должен обрабатывать правильно.

Шпаргалка

Факториал положительного целого числа n (записывается как n!) — это произведение всех положительных целых чисел от 1 до n. Например, 5! = 5 × 4 × 3 × 2 × 1 = 120.

Факториал идеально подходит для рекурсии, так как он разбивается на более мелкие идентичные задачи: 5! = 5 × 4!, а 4! = 4 × 3!, и так далее, пока не будет достигнуто 1! = 1.

int factorial(int n) {
  if (n <= 1) {
    return 1; // Базовый случай
  }
  
  return n * factorial(n - 1); // Рекурсивный шаг
}

Базовый случай останавливает рекурсию, когда n <= 1, возвращая 1. Рекурсивный шаг умножает текущее число на факториал следующего меньшего числа.

Попробуйте сами

import 'dart:io';

// TODO: Создайте здесь свою рекурсивную функцию факториала

void main() {
  // Чтение входной строки, содержащей числа, разделенные запятыми
  String? input = stdin.readLineSync();
  
  // Разделение входных данных и преобразование в целые числа
  List<int> numbers = input!.split(',').map((str) => int.parse(str.trim())).toList();
  
  // TODO: Напишите ниже свой код, чтобы:
  // 1. Обработать каждое число с помощью функции факториала
  // 2. Вычислить сумму всех факториалов
  // 3. Отобразить результаты в требуемом формате
  
  print("Factorial Calculator");
  print("====================");
  print("Processing numbers: $numbers");
  print("====================");
  print("Factorial Results:");
  
  // TODO: Вычислите и выведите результаты факториала здесь
  
  print("====================");
  // TODO: Выведите сумму всех факториалов
  print("Calculation completed successfully");
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком