Comments 8
Для квадрата - Ковер Серпинского.

По поводу снежинок, погуглите "Снежинка Коха". Также будет интересно, наверное, для вас реализовать L-системы, но вообще было это все и на хабре и тысячу раз везде.
Это, действительно, весьма тривиальное упражнение, но в то же время - чрезвычайно эффективное для первых шагов в том или ином языке. Когда я изучал G-code (язык управления станками с ЧПУ), мне понадобился всего день, чтобы разобраться с макросами, переменными и т.п., когда я использовал генерацию фрактальных траекторий как учебный пример.
Стандартные алгоритмы для подготовки к олимпиалному программированию, изучаем рекурсию. Иногда удивляет, как некоторые авторы банальные задачи как какое-то открытие публикуют.
С комплексными числами красивее выходит:
import numpy as np
import matplotlib.pyplot as plt
def render(N=3, d=2, n=10000, R=1):
p = np.zeros(n, dtype=complex)
p[:N] = R*np.exp(1j*2*np.pi*np.arange(N)/N)
for _ in range(N,n):
p1 = np.random.choice(p[:N])
p2 = np.random.choice(p[:_])
p[_] = (p1+p2)/d
plt.plot(p.real, p.imag, '.')
if __name__ == "__main__":
for _ in ((4, 1.7), (3, 2)) :
plt.figure()
render(*_)
plt.gca().set_aspect('equal')
plt.title(f'N={_[0]}, d={_[1]}')
plt.show()
От треугольника Серпинского до «снежинок». Реализовано на Python