Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    combinazioni di numeri

    Ciao a tutti.
    Ho un problema che non riesco a risolvere e che mi sta tirando scemo.
    Premetto che programmo in Visual Basic 6.
    Problema: avendo un vettore di N numeri (es.: 10 interi) voglio ottenere "tutte le possibili combinazioni NON ripetute" di questi elementi presi a 2, 3, 4, ..., 10 elementi per volta.
    E vorrei non dover fare 10 routine diverse (nelle quali dovrei mettere tanti cicli For-next annidati quanti sono gli elementi che devono comporre ogni tipo di raggruppamento).
    Ho quindi pensato di implementare una funzione ricorsiva che inserisca in una matrice di (X,10) elementi tutte le combinazioni calcolate.
    ... ma non riesco a creare detta funzione!!!
    Avete qualche suggerimento? Qualsiasi cosa, tranne una corta al collo! Eheh!
    In ogni caso, che mi rispondiate (spero) oppure no ... grazie mille


    P.S.: Esempio con N = 5 numeri (1 2 3 4 5)

    Combinazioni:
    2 cifre 3 cifre 4 cifre 5 cifre
    1 - 2 1 - 2 - 3 1 - 2 - 3 - 4 1 - 2 - 3 - 4 - 5
    1 - 3 1 - 2 - 4 1 - 2 - 3 - 5
    1 - 4 1 - 2 - 5 1 - 2 - 4 - 5
    1 - 5 1 - 3 - 4 1 - 3 - 4 - 5
    2 - 3 1 - 3 - 5 2 - 3 - 4 - 5
    2 - 4 1 - 4 - 5
    2 - 5 2 - 3 - 4
    3 - 4 2 - 3 - 5
    3 - 5 2 - 4 - 5
    4 - 5 3 - 4 - 5

  2. #2
    Ciao..per realizzare quello che hai chiesto mi servirebbe un pò di tempo, cmq per darti un'idea di come la funzione dovrebbe procedere ti posto questo codice scritto su due piedi..
    Inserisci in un form 3 listbox, list1,list2 e list3.
    codice:
    Private Sub Form_Load()
    Dim Matrice(10) As Long
    For i = 1 To UBound(Matrice)
    Matrice(i) = i
    Next i
    For i = 1 To UBound(Matrice)
        For k = i To UBound(Matrice)
            If Matrice(i) <> Matrice(k) Then
                List1.AddItem i & "-" & k
            End If
                For z = k To UBound(Matrice)
                    If Matrice(i) <> Matrice(z) And Matrice(i) <> Matrice(k) And Matrice(z) <> Matrice(k) Then
                        List2.AddItem i & "-" & k & "-" & z
                    End If
                        For y = z To UBound(Matrice)
                            If Matrice(i) <> Matrice(z) And Matrice(i) <> Matrice(k) _
                            And Matrice(z) <> Matrice(k) And Matrice(y) <> Matrice(k) _
                            And Matrice(y) <> Matrice(z) And Matrice(y) <> Matrice(i) Then
                                List3.AddItem i & "-" & k & "-" & z & "-" & y
                        End If
                        Next y
                Next z
        Next k
    Next i
    End Sub
    Il primo ciclo for/next serve per riempire la matrice, chiaramente per velocizzare ho creato una matrice di numeri in ordine..

    fammi sapere..

    ciao

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,464

    Moderazione

    Originariamente inviato da thejoker73
    Ciao a tutti.
    Ciao e benvenuto nel forum di Programmazione.

    Ti segnalo da subito la lettura del nostro Regolamento che contiene tutte le norme da seguire per partecipare correttamente a quest'area del forum.

    In modo particolare, devi sempre indicare il linguaggio utilizzato nel titolo della discussione, indicando la versione nel caso in cui ne esistesse più di una, assieme ad una sintesi breve ma significativa ed esplicativa del problema.

    Il titolo di questa discussione l'ho corretto io.

    Detto questo, ciao e...buon forum!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  4. #4
    Utente di HTML.it L'avatar di Boolean
    Registrato dal
    Oct 2005
    Messaggi
    758
    sarebbe possibile utilizzare una matrice di controllo binaria per raggiungere lo scopo...

    questo è un esempio, per il quale è necessario utilizzare una listbox e un pulsante:

    codice:
    Private Sub Command1_Click()
    
    Dim Digits As Integer
    Dim dgt()
    Dim arrNumeri(5)
    Dim strComb As String
    
    For K = 0 To UBound(arrNumeri)
        arrNumeri(K) = K
    Next
    
    Digits = 5
    
    Numero = 2 ^ Digits
    
    ReDim dgt(0 To Digits)
    
    For K = 1 To Numero - 1
        For M = 1 To Digits: dgt(M) = 0: Next
        resto = K
        Ind = Digits
        While resto > 0
            dig = resto Mod 2
            resto = Int(resto / 2)
            dgt(Ind) = dig
            Ind = Ind - 1
        Wend
    
        strComb = ""
        For H = 0 To UBound(dgt)
            If dgt(H) = 1 Then
                strComb = strComb & arrNumeri(H) & " "
            End If
        Next H
        If Len(strComb) > 2 Then List1.AddItem strComb
        DoEvents
    Next K
    
    End Sub
    alla fine nella listbox avrai gli elementi raggruppati come ti servono, se anzichè della listbox usi un Array, puoi ordinarli in maniera crescente.

    questo metodo ha il vantagio di funzionare con un numero indefinito di cifre, basta cambiare la variabile Digits e dimensionare diversamente l'array arrNumeri()

    Boolean

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.