2017-05-30 1 views
0

たとえば、もしN = 4 1があるなら、上の三角形と下の三角形それぞれの2 1と対称な各順列で3x3の行列を埋めたいと思う。私は[010,101,010]、[001,001,110]、[011,100,100]を取得します。対角がゼロで、他の要素にN 1があるように、行列を1と0で再帰的に満たす方法はありますか?

+0

なぜ再帰的に行う必要がありますか?問題を再帰的に解くことは、問題を同じではあるが小さい問題に分割し、小さなものを最初に解いてから、再帰を使ってより大きなステップに進めることを意味します。しかし、それはここに当てはまるようには見えません。それをそうする方法で考えることはできません。どのように再帰を使用してそれを解決することを考えましたか、多分私はあなたを助けることができます –

+0

それについて申し訳ありません、私は再帰を意味しないと思う、0,1行列のすべての並べ替えを対角に沿って1と0のすべての量。 –

答えて

0

これはどうですか?

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); 
    } 
} 

各レベルの再帰は、1つの対角要素と、この要素と交差する残りの行/列を設定します。明示的な反復なし


第二の試み:

// 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); 
    } 
} 

このバージョンでは、複数回のマトリックス・セルを設定します。行/列のインデックスは変更されずに維持されます。したがって、再帰は最終的に終了します。

0
#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) 
関連する問題