Salve a tutti, ho trovato un algoritmo che mi visualizza tutte le combinazioni semplici (la cui somma è data dal coefficiente binomiale) dati N numeri, in classi di K (con K< N) che posto perchè spero potrà essere utile anche a qualcun'altro. Il mio problema è che vorrei che visualizzasse le combinazioni in classe K di qualsiasi vettore di N numeri, mentre se inserisco 4 numeri a caso (diciamo 9-12-19-24) in classe 2 per esempio mi rende:
1 2
1 3
1 4
2 3
2 4
3 4
invece di
9 12
9 19
9 24
...
non riesco a dargli in input il vettore che vorrei, e non so se agire all'interno dell'algoritmo oppure nel momento in cui riscrive i riultati sulla textbox. Spero di essermi spiegato bene
Successivamente scrivo le combinazioni su una textboxcodice:Public Function CombinazioniS(ByVal N&, ByVal K&, CombiS&()) As Boolean ' ' Ritorna, nella matrice CombiS(Cnk(N, K), K) con N >= K ' e K > 0, le combinazioni semplici di N oggetti della classe K: ' N = Val(lblSelezionati.Caption) K = Val(ElemScelti) Dim R&, NR&, c&, P& Dim progresso As Double progresso = 0 ' On Error GoTo CombinazioniS_ERR ' NR = Cnk(N, K) ' Numero delle righe. ReDim CombiS(1 To NR, 1 To K) ' ' Scrivo la prima riga: For c = 1 To K CombiS(1, c) = c Next c ' ' Righe rimanenti: For R = 2 To NR ' P = K Do Until CombiS(R - 1, P) < N - K + P P = P - 1 Loop For c = 1 To P - 1 CombiS(R, c) = CombiS(R - 1, c) Next c ' CombiS(R, P) = CombiS(R - 1, P) + 1 ' For c = P + 1 To K CombiS(R, c) = CombiS(R, c - 1) + 1 Next c progresso = progresso + 1 ProgressBar.Value = progresso * 100 / NR ' Next R ' ' CombinazioniS_ERR: CombinazioniS = (Err = 0) If (Err <> 0) Then Dim M$ M$ = "Err. N° " & Err.Number & " " & Err.Description & vbNewLine MsgBox M$, vbCritical, " Function CombinazioniS" End If ' ' ' End Function
codice:If CombinazioniS(N, K, CombiS()) Then txtCombi.Text = strTabella$(CombiS()) Else txtCombi.Text = "" End If
codice:Private Function strTabella$(Tabella&(), Optional ByVal LimiteTB As Boolean = True) ' ' Ritorna una stringa con il contenuto della Tabella. ' Se NR e' molto grande, il tempo impiegato puo' essere ' notevole. Se LimiteTB = True la lunghezza della stringa ' di ritorno viene limitata alla capienza massima di un ' TextBox (circa 32000 caratteri). ' Dim R&, NR&, c&, NC&, LenMax&, TxT$ ' NR = UBound(Tabella, 1) NC = UBound(Tabella, 2) For R = 1 To NR For c = 1 To NC - 1 TxT$ = TxT$ & Right$(" " & Str$(Tabella(R, c)), 3) & "," Next c TxT$ = TxT$ & Right$(" " & Str$(Tabella(R, NC)), 3) & vbNewLine ' DoEvents Next R ' strTabella$ = TxT$ ' ' End Function![]()
![]()


Rispondi quotando