Это не сложно сделать, но вы должны быть осторожны со значением нуля в рекурсии. Это не совсем точно для больших значений n
:
Tn+1 = [[Tn, Tn],
[ 0, Tn]]
Поскольку этот ноль может представлять блок нулей, например, на второй итерации, у вас есть это:
[1, 1, 1, 1],
[0, 1, 0, 1],
[ 0 , 0 , 1, 1],
[ 0 , 0 , 0, 1]
Эти четыре нуля в левом нижнем углу все представлены одним нулем в формуле. Блок нулей должен иметь ту же форму, что и блоки вокруг него.
После этого нужно заставить Нампи привести в порядок вещи для вас. numpy.block
очень удобен для этого и делает его довольно простым:
import numpy as np
def makegasket(n):
if n == 0:
return np.array([1], dtype=int)
else:
node = makegasket(n-1)
return np.block([[node, node], [np.zeros(node.shape, dtype=int), node]])
makegasket(3)
Результат:
array([[1, 1, 1, 1, 1, 1, 1, 1],
[0, 1, 0, 1, 0, 1, 0, 1],
[0, 0, 1, 1, 0, 0, 1, 1],
[0, 0, 0, 1, 0, 0, 0, 1],
[0, 0, 0, 0, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 1, 0, 1],
[0, 0, 0, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 1]])
Если вы используете больший n
, вам может показаться matplotlib.pyplot.imshow
для отображения:
from matplotlib.pyplot import imshow
# ....
imshow(makegasket(7))
![enter image description here](https://i.stack.imgur.com/JxYkV.png)