Как называется функция произведения чисел от 1 до n?
Что проверяют
Сам ответ «факториал» занимает секунду, поэтому вопрос почти всегда продолжается: как вы протестируете такую функцию. Интервьюер смотрит, найдёте ли вы без подсказок граничные значения, переполнение и некорректный ввод.
Как отвечать
Коротко дайте определение: факториал n! это произведение целых чисел от 1 до n, по соглашению 0! = 1, для отрицательных чисел он не определён. Растёт очень быстро: 10! уже равен 3 628 800.
Дальше то, чего ждут от тестировщика, набор проверок:
- граничные значения: 0 и 1 (оба дают 1), 2 как первое «обычное» значение;
- типичные значения: 5 даёт 120, 10 даёт 3 628 800, в роли оракула удобно взять
math.factorialиз Python; - некорректный ввод: отрицательное число, дробное, строка,
null. Ожидаемое поведение нужно знать заранее: исключение, код ошибки или сообщение в интерфейсе; - переполнение: в 32-битный
intпомещается только до 12!, в 64-битныйlongдо 20!. В JavaScript после 18! результат выходит заNumber.MAX_SAFE_INTEGERи теряет точность, а 171! вdoubleпревращается вInfinity; - глубина рекурсии: рекурсивная реализация на Python упрётся в стандартный лимит около 1000 вызовов и бросит
RecursionError, итеративная нет; - производительность: время ответа на больших n, если функция доступна через API.
Если просят написать код, итеративный вариант короче и безопаснее рекурсивного: цикл от 2 до n с накоплением результата. Проверки параметризуйте, например через @pytest.mark.parametrize, чтобы каждое значение было отдельным тестом с понятным отчётом.
Где спотыкаются
Забывают про ноль или считают, что 0! = 0. Это самая частая ошибка реализации и первый тест, который её ловит.
Не спрашивают о требованиях к ошибкам. Сказать «на отрицательное число будет ошибка» мало, тестировщик уточняет, какая именно и как её увидит пользователь.
Проверяют только «счастливые» значения вроде 5 и 6 и не доходят до переполнения, где функция молча возвращает мусор: неверное число, отрицательное или вовсе ноль.