Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475

    [Haskell] Creare lista di interi ricorsivamente

    Ciao a tutti...

    Ho scritto una funzione in Haskell che crea una lista di interi, così:

    codice:
    listDown 0 = [0]
    listDown x = x : listDown (x-1)
    Se l'argomento è 0, ritorna la lista che contiene solo 0, se l'argomento è diverso da 0, aggiunge l'argomento alla lista dei numeri prima di lui... in pratica

    codice:
    listDown 3 == 3: (2: (1: ([0]))) == 3:2:1:[0]
    E fin qui tutto bene... però non riesco a scrivere una funzione che faccia l'opposto, ovvero che crei la lista in ordine crescente!

    Questo perchè i 2 punti (l'operatore cons) permettono di aggiungere un oggetto solo in testa alla lista...

    codice:
    1:[2,3,4] == [1,2,3,4]
    [4,3,2]:1 --> errore
    [4,3]:[2,1] --> errore
    e quindi non so come scriverlo... ovviamente un modo ci deve essere, ma non riesco a capire come scriverlo in modo ricorsivo... qualche idea?
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Update: ok, problema "risolto". Ho trovato una soluzione che però mi sembra molto molto "sporca":

    codice:
    list_up s e
        | s < e = s : (list_up (s+1) e)
        | s == e = [e]
        | s > e = []
    
    listUp x = list_up 0 x
    Funziona, però non so, sento che ci deve essere un modo più elegante di farlo... Cioè, Haskell è fatto apposta per queste cose...
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  3. #3
    Utente di HTML.it L'avatar di toraz
    Registrato dal
    Nov 2001
    Messaggi
    263
    La soluzione più rapida è questa
    codice:
    listUp x = [0..x]
    Oppure puoi semplificare un po' quella che hai scritto

    codice:
    listUp x = listUp' 0 x
    
    listUp' start end
      | start <= end = start : listUp' (start + 1) end
      | otherwise       = []
    mi pare abbastanza ragionevole come soluzione, di certo non molto molto sporca, ma tieni presente che non sono certamente un guru di Haskell.

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Originariamente inviato da toraz
    La soluzione più rapida è questa
    codice:
    listUp x = [0..x]
    ... ._.

    Non pensavo che una sola riga di codice potesse farmi sentire così stupido xD
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.