递归地建立一个上三角矩阵

时间:2019-05-21 20:03:07

标签: python python-3.x recursion matrix

我一直在试图提出一种递归的方法来在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]]

2 个答案:

答案 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))

enter image description here

答案 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的时序结果图。在这种情况下,它显示了使用循环方法的轻微时序优势(以及内存):

enter image description here

这两种算法在我的计算机上的内存消耗都在n = 15左右,这并不奇怪。