Рекурсивная функция: факториал
Часть раздела Логика и управление потоком путешествия по 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), и так далее, пока не будет достигнут базовый случай.
Этот подход демонстрирует, как рекурсия элегантно решает задачи, сводя их к более простым версиям той же задачи, что делает сложные вычисления естественными и интуитивно понятными.
Задание
ЛегкоСоздайте программу, которая вычисляет факториалы для нескольких чисел с использованием рекурсии. Ваша программа продемонстрирует работу рекурсивной функции факториала, обрабатывая список чисел и вычисляя их факториалы.
- Прочитайте строковый ввод, содержащий числа, разделенные запятыми (например,
"3,5,0,7") - Разделите входную строку на отдельные числа и преобразуйте каждое в целое число
- Создайте рекурсивную функцию с именем
factorial, которая принимает целочисленный параметрn - Функция
factorialдолжна реализовывать следующую логику: - Базовый случай: Если
nменьше или равно 1, вернуть 1 - Рекурсивный шаг: Вернуть
n, умноженное наfactorial(n - 1) - Для каждого числа во входном списке вычислите его факториал, используя вашу рекурсивную функцию
- Отобразите результаты, показывая каждое число и соответствующий ему факториал
- Вычислите и отобразите сумму всех результатов факториалов
Например, если на входе "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");
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутая работа со списками
Свойства списка: first и lastСостояние списка: isEmpty и isNotEmptyРазворот спискаДобавление в список: insertУдаление из списка: removeWhereПоиск в списке: indexOfСортировка спискаПеремешивание спискаИтоги — Органайзер списков4Продвинутая работа с Map
Итерация по MapПроверка ключей и значенийСвойства Map: keys и valuesУсловное добавление: putIfAbsentУдаление записей из MapВложенные MapИтоги — Обновление инвентаря7Продвинутые функции
Анонимные функцииПередача функций в качестве аргументовПонимание замыканийВведение в рекурсиюРекурсивная функция: обратный отсчётРекурсивная функция: факториалИтоги — Обработчик списков2Функциональные операции со списками
Преобразование с помощью 'map'Фильтрация с помощью 'where'Использование '.toList()'Проверка условий с помощью 'any'Условия с 'every'Поиск с помощью 'firstWhere'Повторение — фильтрация данных5Проект: Калькулятор корзины
Настройка проектаДобавление товаров в корзину3Множества
Что такое множество?Создание множестваДобавление и удаление элементовПроверка наличия элементов в множествеПреобразование списка в множествоОбъединение множествПересечение множествРазность множествИтоги: уникальный список гостей