Я согласен с мнением @quamrana по этому вопросу, но давайте решим, что может быть трудной проблемой. С небольшой хитростью.
Во-первых, ваша консолидированная функция должна принимать четыре аргумента, поскольку аргумент order
для circle()
не связан с аргументом order
для fract()
. Мы переименуем первый из них в sides()
, поскольку это то, что он представляет.
Во-вторых, ваша fract()
функция не полностью рекурсивная , она использует итерацию для внутреннего использования. Я собираюсь следовать той же схеме в моем решении.
Наконец, нам нужно немного скрытой информации для работы - вы можете использовать пятый аргумент по умолчанию, который изменяется внутри, но вместо этого я собираюсь поиграть с типом sides
для достижения этого результата:
import turtle as t
def fract(t, sides, order, size):
if order == 0:
t.forward(size)
elif sides is not None:
for _ in range(sides):
fract(t, None, order, size)
t.right(360 / sides)
else:
for angle in (60, -120, 60, 0):
fract(t, None, order - 1, size / 3)
t.left(angle)
t.speed('fastest') # because I have no patience
fract(t, 4, 2, 300)
t.hideturtle()
t.exitonclick()
Я считаю, что это позволяет достичь желаемого результата с минимальными изменениями в исходном коде. В дополнение к вызову fract(t, 4, 2, 300)
, который создает исходную фигуру, мы также можем сделать такие варианты, как fract(t, 3, 3, 300)
:
Следующая проблема, которую вы, возможно, захотите решить, - это центрирование этих изображений на экране, чтобы fract(t, 5, 1, 300)
не падало с края.