0
例如,如果存在N = 4 1,我想填充3×3矩陣,每個置換在每個上下三角形中與2 1對稱。我會得到[010,101,010],[001,001,110]和[011,100,100]。如何用1和零遞歸地填充矩陣,使得對角線爲零,並且在其他元素中有N 1個?例如
例如,如果存在N = 4 1,我想填充3×3矩陣,每個置換在每個上下三角形中與2 1對稱。我會得到[010,101,010],[001,001,110]和[011,100,100]。如何用1和零遞歸地填充矩陣,使得對角線爲零,並且在其他元素中有N 1個?例如
這是怎麼回事?
void matrixFill(int[,] m, int n)
{
m[n-1, n-1] = 0;
if (n > 1)
{
for (int i = 0; i < n-1; i++)
{
m[i, n-1] = 1;
m[n-1, i] = 1;
}
matrixFill(m , n-1);
}
}
遞歸的每個級別設置一個對角線元素並且其餘的行/列在該元素中相交。
沒有明確的迭代第2次嘗試:
// 1st call matrixFill2(m , n-1, n-1)
void matrixFill2(int[,] m, int x, int y)
{
if ((x >= 0) && (y >= 0))
{
m[x, y] = (x == y) ? 0 : 1;
matrixFill2(m, x-1, y);
matrixFill2(m, x, y-1);
matrixFill2(m, x-1, y-1);
}
}
這個版本將設置母細胞不止一次。行/列索引保持不變或減少。因此,遞歸最終會終止。
#Figured it out
from __future__ import print_function
import itertools
import numpy as np
N = 4
S = N*(N-1)/2
E = 3
which = np.array(list(itertools.combinations(range(S), E)))
grid = np.zeros((len(which), S), dtype="int8")
grid[np.arange(len(which))[None].T, which] = 1
for perm in range(len(grid)):
grid_num = perm
A = np.zeros((N,N))
counter = 0
for i in range(N):
for j in range(i):
A[i][j] = grid[grid_num][counter]
A[j][i] = grid[grid_num][counter]
counter = counter + 1
print()
print(A)
爲什麼你需要遞歸地做呢?遞歸地解決問題意味着您可以將問題分成相同但較小的問題,首先解決較小的問題,然後使用遞歸逐步實現更大的問題。但這似乎並不是這種情況,不能認爲有辦法這樣做。告訴我你是怎麼想到用遞歸來解決這個問題的,也許我可以幫你 –
對不起,我想我並不是說要做遞歸,只是一種獲得0,1矩陣的所有置換的方式,只有一定的1的數量和沿着對角線的全部0。 –