Когда я хочу знать, что делает алгоритм, я часто кодирую и выполняю его.
Вставка операторов print
для отслеживания выполнения и потока данных помогает показать иерархию вызовов.
indent = ""
def exercise(n):
global indent
indent += " "
print(indent, "ENTER", n)
# Original assignment, with assigned output not indented
print("REAL", n)
if n < 3:
exercise(n+1)
print("REAL", n)
print(indent, "LEAVE", n)
indent = indent[2:]
exercise(1)
Вывод: здесь трассировка выполнения с выводом присваивания, помеченным как «REAL». Функции входа и выхода являются торговыми и с отступом.
ENTER 1
REAL 1
ENTER 2
REAL 2
ENTER 3
REAL 3
REAL 3
LEAVE 3
REAL 2
LEAVE 2
REAL 1
LEAVE 1
Да, это легко сделать с помощью пары петель. Является ли это «большой разницей», зависит от вашей оценочной функции. Например:
for i in range(1, n+1):
print(n)
for i in range(n, 0, -1):
print(n)
Если ваша обработка отдельного случая тривиальна (например, print(n)
), то это легко. Когда ваша итерация от одного элемента к следующему тривиальна (например, n+1
), тогда это легко. Однако, когда любой из них сложный, рекурсия часто является более подходящим способом описания и реализации процесса.