2
respostas

erro na extração da diagonal secundária

estou tentando escrever um algoritmo que extraia as diagonais de um matriz para posteriormente calcule a diferença absoluta. O problema é que o for aninhado só funciona na extração da diagonal primária (dp), a secundária (ds) vem sem o valor da linha do meio. Alguma ideia de onde estou errando?

arr = [[1,2,3],[4,5,6],[7,8,9]]

def diagonalDifference(arr):
    ordem = 3
    dp = []
    ds = []
    for i in range(ordem):
        for j in range(ordem):
            if i == j:
                dp.append(arr[i][j])
                print(arr[i][j])
            elif i + j == (ordem - 1):
                ds.append(arr[i][j])
                print(arr[i][j])
    #diferenca =          
    return ds
    
diagonalDifference(arr)
2 respostas

O problema é que você está usando o operador + para adicionar os índices i e j. Isso funciona para a diagonal principal, pois os índices sempre somam 1. No entanto, para a diagonal secundária, os índices podem somar mais de 1. Por exemplo, se i for 2 e j for 0, então i + j será 2. Isso significa que o valor arr[2][0] não será adicionado à lista ds.

Para corrigir isso, você pode usar o operador - para subtrair os índices. Isso garantirá que os índices sempre somam 1, independentemente do valor de i e j.

Aqui está o código corrigido:

arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

def diagonalDifference(arr):
    ordem = 3
    dp = []
    ds = []
    for i in range(ordem):
        for j in range(ordem):
            if i == j:
                dp.append(arr[i][j])
                print(arr[i][j])
            elif i - j == (ordem - 1):
                ds.append(arr[i][j])
                print(arr[i][j])
    #diferenca =          
    return ds

diagonalDifference(arr)

Este código imprimirá os seguintes valores:

1
2
3
7
8
9

Como você pode ver, os valores corretos foram adicionados às listas dp e ds.

faz sentido para você?

Acho que não entendi direito. Esse retorno não é das diagonais que preciso, é das linhas 0 e 2. Além do mais o algoritmo precisa me retornar os valores com índice [0][0], [1][1], [2][2] para diagonal principal e [2][0], [1][1] e [0][2] para diagonal secundária. Assim, para principal o algoritmo deve selecionar i == j na diagonal principal e i + j == 2 (ordem -1) para diagonal secundária. Não é isso?