Описание задачи
Программа получает на вход число и определяет, является ли это число простым или нет, используя рекурсивный алгоритм.
Решение задачи
- Принимаем число и записываем его в отдельную переменную.
- Передаем это число в качестве аргумента в рекурсивную функцию. В качестве второго аргумента этой рекурсивной функции будет переменная-делитель. Она при первом вызове инициируется значением
None
. - Затем делителю присваивается значение на единицу меньшее, чем наше число, и проверяется, делится ли число на него без остатка. Если делится, программа завершает работу и определяет, что число не является простым.
- Если нет, то функция рекурсивно вызывает саму себя, причем второй аргумент (делитель) теперь на
1
меньше, чем был до этого. - Таким образом, мы проверяем делимость исходного числа на все числа, которые меньше него и больше
1
. Если хоть на одно из этих чисел оно делится без остатка, функция возвращаетFalse
. В противном случае число считается простым. - Выводим результат на экран.
- Конец.
Исходный код
Ниже дан исходный код, который осуществляет проверку числа на простоту с использованием рекурсии. Результаты работы программы также даны ниже.
def check(n, div = None): if div is None: div = n - 1 while div >= 2: if n % div == 0: print("Число не является простым") return False else: return check(n, div-1) else: print("Число является простым") return True n = int(input("Введите число: ")) check(n)
Объяснение работы программы
- Принимаем число и записываем его в отдельную переменную
n
. - Передаем это число в качестве аргумента в рекурсивную функцию
check()
. В качестве второго аргумента этой рекурсивной функции передается переменнаяdiv
, которая будет делителем. Она при первом вызове инициируется значениемNone
. - Затем делителю присваивается значение на единицу меньшее, чем наше число, и проверяется, делится ли число на этот делитель без остатка. Если делится, программа завершает работу и определяет, что число не является простым.
- Если нет, то функция рекурсивно вызывает саму себя следующим образом:
check(n, div-1)
. Заметьте, что второй аргументdiv
теперь на1
меньше, чем был до этого. - Таким образом мы проверяем делимость исходного числа на все числа, которые меньше него и больше
1
. Если хоть на одно из этих чисел оно делится без остатка, функция возвращаетFalse
: число не является простым. А если нет, то число простое. - Выводим результат на экран.
Результаты работы программы
Пример 1: Введите число: 13 Число является простым Пример 2: Введите число: 30 Число не является простым
Примечание переводчика
Данный код приведен лишь для примера использования рекурсии. С вычислительной точки зрения он является крайне несовершенным. Так, например, рассматриваемый нами ранее алгоритм решета Эратосфена гораздо экономичней. В данном же коде есть недостатки. Например, совсем необязательно проверять, делится ли число n
на n - 1
без остатка, и так ясно, что нет. Предоставим читателям возможность самим улучшить данный код.