Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello
AMD ha aggiornato l'offerta di CPU HEDT con i Ryzen Threadripper 9000 basati su architettura Zen 5. In questo articolo vediamo come si comportano i modelli con 64 e 32 core 9980X e 9970X. Venduti allo stesso prezzo dei predecessori e compatibili con il medesimo socket, le nuove proposte si candidano a essere ottimi compagni per chi è in cerca di potenza dei calcolo e tante linee PCI Express per workstation grafiche e destinate all'AI.
Acer TravelMate P4 14: tanta sostanza per l'utente aziendale
Acer TravelMate P4 14: tanta sostanza per l'utente aziendale
Forte di soluzioni tecniche specifiche, il notebook Acer TravelMate P4 14 abbina dimensioni compatte e buona robustezza per rispondere alle necessità specifiche degli utenti aziendali. La piattaforma AMD Ryzen 7 Pro assicura prestazioni elevate con i tipici ambiti di produttività personale e sul lavoro, mantenendo un'elevata autonomia.
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque
Dal salotto al giardino, il nuovo proiettore laser di Hisense promette esperienze cinematografiche in qualsiasi contesto: qualità d’immagine, semplicità d’uso, versatilità e prezzo competitivo il suo poker d'assi
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 28-08-2009, 02:32   #1
Gremo
Senior Member
 
L'Avatar di Gremo
 
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 . L'idea è: tutto quello che è a sinistra della diagonale deve essere nullo E la diagonale deve essere diversa da zero O questo deve verificarsi nella prossima riga E la parte a destra della diagonale deve essere nulla.

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...)
a pensare ricorsivo mi va via la testa...poi funzionale non ne parliamo
Gremo è offline   Rispondi citando il messaggio o parte di esso
Old 28-08-2009, 09:40   #2
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da Gremo Guarda i messaggi
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 . L'idea è: tutto quello che è a sinistra della diagonale deve essere nullo E la diagonale deve essere diversa da zero O questo deve verificarsi nella prossima riga E la parte a destra della diagonale deve essere nulla.

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...)
a pensare ricorsivo mi va via la testa...poi funzionale non ne parliamo
A naso direi che il problema e' che nel passo ricorsivo non vai a lavorare nella sottomatrice quadrata (n-1)x(n-1), ma nella (n-1)xn

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
marco.r è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello Ryzen Threadripper 9980X e 9970X alla prova: AMD...
Acer TravelMate P4 14: tanta sostanza per l'utente aziendale Acer TravelMate P4 14: tanta sostanza per l'uten...
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque Hisense M2 Pro: dove lo metti, sta. Mini proiett...
Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il c...
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart Intervista a Stop Killing Games: distruggere vid...
Xbox: dal prossimo mese verifica dell'id...
Corsair AI Workstation 300: poco pi&ugra...
Addio a Elio Marioli, un pioniere della ...
L'IA sta già diminuendo il potere...
Guida autonoma? Gli ADAS falliscono e in...
Skechers lancia le scarpe per bambini co...
Revolut e Audi F1: un’alleanza rivoluzio...
Gestione attività di Windows 11 d...
Amazon lancia il nuovo videocitofono Bli...
Robot aspirapolvere al top: i nuovi DEEB...
Opera vs Microsoft: la guerra dei browse...
Router e ripetitori FRITZ! in offerta su...
Spotify vola a quota 700 milioni di uten...
Microsoft pronta ad abbandonare il launc...
Windows 11, arriva una feature multimoni...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 23:35.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v