|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Oct 2000
Città: Udine
Messaggi: 3178
|
[Haskell - Linguaggi funzionali] Matrice diagonale - a chi piace la ricorsione?
Mi trovo a dover implementare una funzione in Haskell che restituisce True se una matrice (quadrata) è diagonale e False altrimenti. Il codice è riportato qui sotto, le matrici sono implementate come lista di liste per righe, ad esempio [[1, 0], [0, 2]].
Il codice non funziona correttamente e non capisco il perchè - forse perchè non mi è mai piaciuta la ricorsione ![]() Come mai non va ![]() Codice:
-- -- Determina se una matrice (quadrata) è diagonale -- isDiagonal [] = False isDiagonal (x:xs) | length x == 1 = True -- matrice 1x1 è diagonale | otherwise = all (==0) l && ((d /= 0) || isDiagonal xs) && all (==0) r where n = length x - length xs -- col. riga corrente - righe rimanenti l = take (n-1) x -- parte sx diagonale d = last (take n x) -- elemento diagonale r = drop n x -- parte dx diagonale -- NOTE (per chi non conosce la sintassi Haskell) -- all (==0) restuisce True se ogni elemento della lista è nullo -- /= 0 significa diverso da zero -- x è la prima riga, xs rappresenta il resto della lista -- (quindi le altre righe...) ![]() |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Qualcosa come segue dovrebbe andare meglio: Codice:
isDiagonal [] = False isDiagonal [[_]] = True isDiagonal matrix = let row1 x = tail $ head x col1 x = tail $ head $ transpose x subMatrix x = map tail $ tail x in all (==0) (row1 matrix) && all (==0) (col1 matrix) && isDiagonal (subMatrix matrix)
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:35.