我一直在试图提出一种递归的方法来在python中构建以下矩阵,这让我很头疼。没有指针,这是一个很大的挑战。有人可以帮我吗?
递归如下:
> str_match(references, ":\\s*([^:]*?)(?:,\\s*(?:v|no|p)\\.)")[,2]
[1] "Journal of Neverland" "Journal of Neverland" "Journal of Neverland"
我已经尝试了一些递归函数的多次迭代,但是我无法将其包裹住。
T0 = 1,
Tn+1 = [[Tn, Tn],
[ 0, Tn]]
答案 0 :(得分:2)
这并不难,但是您需要注意递归中零的含义。对于较大的n
来说,这不是很精确:
Tn+1 = [[Tn, Tn],
[ 0, Tn]]
因为零可以表示一个零块,例如在第二次迭代中,您这样:
[1,1,1,1],
[0,1,0,1],
[ 0 , 0 ,1、1],
[ 0 , 0 ,0、1]
左下角的四个零在公式中均由一个零表示。零块必须与周围的块具有相同的形状。
在那之后,要做的就是让Numpy为您放置正确的顺序和形状的东西。 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))
答案 1 :(得分:1)
您实际上不需要递归函数即可实现此递归。这个想法是从UR角开始并向外扩展。您甚至可以从UL角落开始,避免做一些记账工作,并沿任一轴翻转矩阵,但是从长远来看,这样做效率不高。
def build_matrix(n):
size = 2**n
# Depending on the application, even dtype=np.bool might work
matrix = np.zeros((size, size), dtype=np.int)
# This is t[0]
matrix[0, -1] = 1
for i in range(n):
k = 2**i
matrix[:k, -2 * k:-k] = matrix[k:2 * k, -k:] = matrix[:k, -k:]
return matrix
只是为了好玩,这是此实现与@Mark Meyer's answer的时序结果图。在这种情况下,它显示了使用循环方法的轻微时序优势(以及内存):
这两种算法在我的计算机上的内存消耗都在n = 15左右,这并不奇怪。