Шаг 31.
Рекурсия на Python.
Методика рекурсивного мышления. Примеры задач
На этом шаге мы рассмотрим несколько простых заданий и приведем их решения.
Приведем несколько примеров решения задач.
Задание 1.
Рассмотрим функцию суммирования первых n положительных целых чисел (1.5). Определите обобщённую функцию,
которая применима также ко всем неотрицательным целым числам. Другими словами, измените функцию с учётом того, что она может получать в качестве аргумента n = 0.
После этого закодируйте функцию.
Раскрыть/скрыть решение и комментарии.
При n = 0 сумма должна возвращать значение 0. В противном случае - уменьшать значение n на единицу.
0, если n = 0
S(n) =
S(n - 1) + n, если n > 0
Вот текст программы:
Задание 1. Ссуммирование первых
n неорицательных целых чисел
1 2 3 4 5 |
def f_1(n):
if n == 0:
return 0
else:
return n + f_1(n - 1)
|
Архив с файлом можно взять
здесь.
Задание 2.
Рассмотрим задачу вывода на экран цифр некоторого неотрицательного целого числа n вертикально в прямом порядке, где старший разряд должен появиться в 1-й строке, следующий за
ним – во 2-й и т. д. Например, если n = 2743, программа должна выдать на экран следующие строки:
Выведите рекурсивное условие и закодируйте метод.
Раскрыть/скрыть решение и комментарии.
В отличие от задания, приведенного на 28 шаге, здесь старшая цифра числа должна быть выведена на 1-м месте, следующая по
старшинству - на 2-м и т.д. Следовательно, надо знать, сколько цифр в числе и делить целочисленно это число на 10 в степени, равной количеству цифр в числе, уменьшенному на 1. Например, если задано число
362, то его нужно целочисленно делить на 100 (103-1). Продолжать рекурсию с числом, равным остатку от деления этого числа на 10 в степени, равной количеству цифр в числе, уменьшенному на 1.
Процесс прекратить, когда получим число, меньшее 10.
Вот текст программы:
Задание 1. Ссуммирование первых
n неорицательных целых чисел
1 2 3 4 5 6 |
def f_2(n):
if n < 10:
print(n)
else:
print(n // 10 ** (len(str(n)) - 1))
f_2(n % 10 ** (len(str(n)) - 1))
|
Архив с файлом можно взять
здесь.
Задание 3. Определите рекурсивную функцию, вычисляющую наибольшее значение в списке из n элементов, когда декомпозиция просто уменьшает размер задачи на 1.
Раскрыть/скрыть решение и комментарии.
Алгоритм приведенного ниже решения следующий.
- Если в списке один элемент, то его значение - решение задачи.
- Если элементов больше 1, то результат решения - максимальное значение из, например, последнего элемента и списка без последнего элемента.
Вот текст функции, реализующей указанный алгоритм.
Задание 1. Ссуммирование первых
n неорицательных целых чисел
1 2 3 4 5 6 7 8 9 10 |
def f_3(a):
if len(a) == 1:
return a[0]
else:
return max(f_3(a[0:len(a) - 1]), a[len(a) - 1])
# Some list:
v = [5, -1, 3, 2, 4, 7, 2]
print(f_3(v))
|
Архив с файлом можно взять
здесь.
Со следующего шага мы начнем рассматривать анализ времени выполнения рекурсивных алгоритмов.
Предыдущий шаг
Содержание
Следующий шаг