(проверка на симметрию в Python) почему он возвращает 1 независимо от входных данных матрицы? - PullRequest
0 голосов
/ 20 марта 2019

Этот код Python должен проверять симметрию матрицы и возвращать 1, если он симметричный, -1, если он асимметричный, и 0 в противном случае.Мой код всегда возвращает 1. Как получилось?

N=3
def isSymmetric(mat,N): 
for i in range(N): 
    for j in range(N): 
      return  (mat[i][j] == mat[j][i])
 def isSkew(mat,N):
for i in range(N):
    for j in range(N):
        return (mat[i][j]==-mat[j][i])
def test(mat,N):
if isSymmetric(mat,N):
    return 1
if isSkew(mat,N):
    return -1
else:
    return 0;

 # Driver code 
  mat = [ [0,1,0 ], [ 4,4,3 ], [5,4,6  ] ] 
  print(test(isSymmetric(mat,N)))

1 Ответ

0 голосов
/ 20 марта 2019

Логика вашего кода запутана. Каждая функция возвращает логическое значение, и эти первые два запускают только одно сравнение, прежде чем они возвращают значение и прекращают работу. Они на самом деле не смотрят на всю матрицу, и то, что вы возвращаете, не будет иметь смысла, даже если они это сделают. Хорошее эмпирическое правило - думать об операторе присваивания (=) как о формулировке (Вы являетесь руководителем группы.), А об операторе равенства (==) задаете вопрос (Вы являетесь руководителем группы?). Вы используете это, чтобы проверить, равны ли значения, а не утверждать, что они есть.

Если вы скажете return x==y, все, что вы получите, это логическое значение, которое сообщает вам, хранят ли эти переменные одно и то же значение, и в случае вашего цикла они всегда будут. Это потому, что mat [0] [0] (первый элемент mat [i] [j]), всегда будет равен mat [0] [0] (первый элемент mat [j] [i]). То, что вы хотите, чтобы эти две первые функции делали, это генерирует транспонированные и негативно транспонированные матрицы. Затем ваша тестовая функция может проверить эти матрицы на соответствие оригиналу и посмотреть, являются ли они симметричными или наклонными. Это работает:

def isSymmetric(mat, N): 
  newmat = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
  for i in range(N): 
    for j in range(N): 
      newmat[i][j] = mat[j][i]
  return newmat

def isSkew(mat, N):
  newmat = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
  for i in range(N):
    for j in range(N):
        newmat[i][j] = -mat[j][i]
  return newmat

def test(mat, N):
  if isSymmetric(mat, N) == mat:
    return 1
  if isSkew(mat, N) == mat:
    return -1
  else:
    return 0;

N = 3
mat = [[0, 1, -2], [-1, 0, 3], [2, -3, 0]] 
print(test(mat, N))
>>> -1

N = 3
mat = [[1, 1, -1], [1, 2, 0], [-1, 0, 5]] 
print(test(mat, N))
>>> 1

N = 3
mat = [[1, 1, -1], [11, 2, 0], [4, 9, 5]] 
print(test(mat, N))
>>> 0
...