Шаг 168.
Рекурсия на Python.
Выполнение программы. Примеры задач
На этом шаге мы рассмотрим несколько заданий и приведем их решения.
Приведем несколько примеров решения задач.
Задание 1.
Ниже приведены две функции - сложения и подсчёта цифр неотрицательного целого числа n. Одна из них - неправильная. Объясните, в чём ошибка и какое проектное решение привело к ней.
def add_digits(n):
if n == 0:
return 0
else:
return add_digits(n // 10) + (n % 10)
def count_digits(n):
if n == 0:
return 0
else:
return count_digits(n // 10) + 1
Раскрыть/скрыть решение и комментарии.
Неправильной является функция count_digits(). По условию задачи на вход функции подаются целые неотрицательные числа, в том числе и 0. Количество цифр в нем равно 1, а функция вернет значение 0.
Здесь смешались два понятия: количество цифр и их сумма. Как вариант можно предложить добавить в перечень параметров функции счетчик количества обращений к ней. Когда n == 0 и счетчик равен 1, возвращать
значение 1
в противном случает выполнять конструкцию
Текст этой функции может выглядеть так:
Задание 1.
1 2 3 4 5 6 7 8 |
def count_digits(n, count):
if n == 0:
if count == 1:
return 1
else:
return 0
else:
return count_digits(n // 10, count + 1) + 1
|
Архив с файлом можно взять
здесь.
Задание 2.
Функция в тексте ниже подсчитывает количество двойных символов (например, 'ее', 'оо') в списке длины n ≥ 1. Но в ней есть ошибка. Найдите и устраните её.
def count_consecutive_pairs(a):
if len(a) == 2:
return int(a[0] == a[1])
else:
return int(a[0] == a[1]) + count_consecutive_pairs(a[1:])
Раскрыть/скрыть решение и комментарии.
Тут все достаточно просто: по условию сказано, что длина списка n ≥ 1, но случай n = 1 нигде не обрабатывается, поэтому при задании списка, состоящего из одного
элемента, будет выдано сообщение об ошибке.
Добавим обработку этого случая:
Задание 2.
1 2 3 4 5 6 7 |
def count_consecutive_pairs(a):
if len(a) == 1:
return 0
if len(a) == 2:
return int(a[0] == a[1])
else:
return int(a[0] == a[1]) + count_consecutive_pairs(a[1:])
|
Архив с файлом можно взять
здесь.
Задание 3.
Код в примере ниже предположительно вычисляет нижнюю границу логарифма: ⌊ logbx ⌋, где x ≥ 1 - вещественное число, а b ≥ 2 - целое число.
Суть его состоит в подсчете количества возможных делений числа x на b. Однако этот код содержит ошибки. Найдите и устраните их, изменив код.
def floor_log(x, b):
if x == 1:
return 0
else :
return 1 + floor_log(x / b, b)
Раскрыть/скрыть решение и комментарии.
В этой задаче нам нужно вычислять количество делений x на b, поэтому условием выхода из рекурсии долно стать событие невозможности выполнения такого деления, то есть
должно выполняться условие x < b. Функция будет выглядеть так:
Задание 3.
1 2 3 4 5 |
def floor_log(x, b):
if x < b:
return 0
else :
return 1 + floor_log(x / b, b)
|
Архив с файлом можно взять
здесь.
Со следующего шага мы начнем рассматривать вложенную и хвостовую рекурсию.
Предыдущий шаг
Содержание
Следующий шаг