Интеграция вычисления факториала в метод класса

Поместите функцию в класс как public-метод и вызывайте через экземпляр. Проверка отрицательного аргумента сохраняется; для больших n нужно учитывать предел int.

Короткий ответ

Что ответить на собеседовании

Поместите функцию в класс как public-метод и вызывайте через экземпляр. Проверка отрицательного аргумента сохраняется; для больших n нужно учитывать предел int.

Подробный разбор

Ответ с пояснениями

Условие

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

function factorial(int $num): int
{
    if ($num < 0) {
        throw new Exception('num less 0');
    }
    $resultNum = 1;
    for($i = 1; $i <= $num; $i++)
    {
        $resultNum *= $i;
    }
    return $resultNum;
}

try {
    echo factorial(-5);
} catch (Exception $e) {
    echo $e->getMessage();
}

Перенесите эту реализацию в класс, сделав её методом, и продемонстрируйте её работу, корректно обрабатывая возможные ошибки.

Ответ

Поместите функцию в класс как public-метод и вызывайте через экземпляр. Проверка отрицательного аргумента сохраняется; для больших n нужно учитывать предел int.

class Math {
    public function factorial(int $num): int {
        if ($num < 0) throw new Exception('num less 0');
        $result = 1;
        for ($i = 2; $i <= $num; $i++) {
            if ($result > intdiv(PHP_INT_MAX, $i)) throw new OverflowException();
            $result *= $i;
        }
        return $result;
    }
}
try { echo (new Math())->factorial(-5); }
catch (Exception $e) { echo $e->getMessage(); }

Пример выведет num less 0; для 0 результат равен 1. Проверка переполнения предотвращает неявный переход результата к float.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее