Discussione:
permutazioni senza ripetizioni
(troppo vecchio per rispondere)
AEOM
2004-09-09 07:51:05 UTC
Permalink
Ciao a tutti

ho bisogno di permutare N cifre prese K alla volta (K<=N) senza
ripetizioni, qualcuno ha del codice da postarmi

ciao, AEOM
MA
2004-09-09 08:05:23 UTC
Permalink
"AEOM" <***@motherfucker.it>

Caruccio l'indirzzo...
Post by AEOM
Ciao a tutti
ho bisogno di permutare N cifre prese K alla
volta (K<=N) senza
Post by AEOM
ripetizioni, qualcuno ha del codice da postarmi
Fai un esempio?
MAssimiliano
AEOM
2004-09-09 10:28:12 UTC
Permalink
Post by MA
Caruccio l'indirzzo...
Post by AEOM
Ciao a tutti
ho bisogno di permutare N cifre prese K alla
volta (K<=N) senza
Post by AEOM
ripetizioni, qualcuno ha del codice da postarmi
Fai un esempio?
MAssimiliano
allora vorrei dato l'array(10, 15, 20, 25, 30) quindi n=5
per k=3
deve restiuirmi la matrice

10, 15, 20
10, 15, 25
10, 15, 30
10, 20, 25
10, 20, 30
10, 25, 30
15, 20, 25
15, 25, 30
20, 25, 30
...dovrebbero essere tutte


ciao, AEOM
namor
2004-09-09 10:51:50 UTC
Permalink
Post by AEOM
Post by MA
Caruccio l'indirzzo...
Post by AEOM
Ciao a tutti
ho bisogno di permutare N cifre prese K alla
volta (K<=N) senza
Post by AEOM
ripetizioni, qualcuno ha del codice da postarmi
Fai un esempio?
MAssimiliano
allora vorrei dato l'array(10, 15, 20, 25, 30) quindi n=5
per k=3
deve restiuirmi la matrice
10, 15, 20
10, 15, 25
10, 15, 30
10, 20, 25
10, 20, 30
10, 25, 30
15, 20, 25
15, 25, 30
20, 25, 30
....dovrebbero essere tutte
ciao, AEOM
Avevo dato un algoritmo tempo fa ad uno che voleva calcolare tutte le
possibili combinazioni per il superenalotto.
Era una cosa con cicli for nidificati e interdipendenti tipo questa:

for i1=1 to n
for i2=i1 to n
for i3=i2 to n
combinazione = valori(i1) & valori(i2) & valori(i3)
next i3
next i2
next i1

Namor
--
namor at inwind punto it

questo articolo e` stato inviato via web dal servizio gratuito
http://www.newsland.it/news segnala gli abusi ad ***@newsland.it
Bruno Campanini
2004-09-09 11:12:25 UTC
Permalink
Post by AEOM
allora vorrei dato l'array(10, 15, 20, 25, 30) quindi n=5
per k=3
deve restiuirmi la matrice
10, 15, 20
10, 15, 25
10, 15, 30
10, 20, 25
10, 20, 30
10, 25, 30
15, 20, 25
15, 25, 30
20, 25, 30
...dovrebbero essere tutte
Bene, allora ti servono le Combinazioni semplici
C5,3 = 10 e dalla tua lista manca 15 20 30.

Ciao
Bruno
AEOM
2004-09-09 11:24:28 UTC
Permalink
Post by Bruno Campanini
Post by AEOM
allora vorrei dato l'array(10, 15, 20, 25, 30) quindi n=5
per k=3
deve restiuirmi la matrice
10, 15, 20
10, 15, 25
10, 15, 30
10, 20, 25
10, 20, 30
10, 25, 30
15, 20, 25
15, 25, 30
20, 25, 30
...dovrebbero essere tutte
Bene, allora ti servono le Combinazioni semplici
C5,3 = 10 e dalla tua lista manca 15 20 30.
Ciao
Bruno
Che mi servivano l'avevo capito....hai un algoritmo già pronto da postare?

ciao, AEOM
Bruno Campanini
2004-09-09 11:37:35 UTC
Permalink
Post by AEOM
Che mi servivano l'avevo capito....hai un algoritmo già pronto da postare?
ciao, AEOM
Eccolo, il tempo di farlo:

Private Sub Command0_Click()
Dim i As Integer, j As Integer, k As Integer
Dim MyArray(1 To 5) As Integer, n As Integer

MyArray(1) = 10
MyArray(2) = 15
MyArray(3) = 20
MyArray(4) = 25
MyArray(5) = 30

n = 0
For i = 1 To 3
For j = i + 1 To 5
For k = j + 1 To 5
n = n + 1
Debug.Print n, MyArray(i); MyArray(j); MyArray(k)
Next k
Next j
Next i

End Sub

Ciao
Bruno
namor
2004-09-09 11:49:49 UTC
Permalink
Bruno Campanini ha scritto:

[cut]
Post by Bruno Campanini
For j = i + 1 To 5
For j = i + 1 To 4

L'output non cambia ma si evita un'iterazione inutile.
Namor
--
namor at inwind punto it

questo articolo e` stato inviato via web dal servizio gratuito
http://www.newsland.it/news segnala gli abusi ad ***@newsland.it
Bruno Campanini
2004-09-09 12:08:47 UTC
Permalink
Post by namor
[cut]
Post by Bruno Campanini
For j = i + 1 To 5
For j = i + 1 To 4
L'output non cambia ma si evita un'iterazione inutile.
Namor
Esatto!!!
Ne approfitto per una domanda:
Sai che esista in Access la funzione Fattoriale (n!).
Non riesco a trovarla.

Bruno
namor
2004-09-09 14:11:59 UTC
Permalink
"Bruno Campanini" <***@tin.it> ha scritto nel messaggio news:jJX%c.284343$***@news4.tin.it...

[cut]
Post by Bruno Campanini
Sai che esista in Access la funzione Fattoriale (n!).
Non riesco a trovarla.
Bruno
Che io sappia non esiste ma la puoi scrivere in un modulo in poche righe se
la fai ricorsiva:

public function fattoriale(Num as integer) as decimal
if num<0 then fattoriale=0
if num=1 or num=0 then
fattoriale=1
else
fattoriale=num*fattoriale(num-1)
end if
end function

Provala e aggiungi la gestione degli errori dato che con i fattoriali che è
facile andare in overflow. Ho usato il tipo decimal appunto perchè gestisce
numeri grossi.
Namor
Bruno Campanini
2004-09-09 15:34:20 UTC
Permalink
Post by namor
[cut]
Post by Bruno Campanini
Sai che esista in Access la funzione Fattoriale (n!).
Non riesco a trovarla.
Bruno
Che io sappia non esiste ma la puoi scrivere in un modulo in poche righe se
public function fattoriale(Num as integer) as decimal
if num<0 then fattoriale=0
if num=1 or num=0 then
fattoriale=1
else
fattoriale=num*fattoriale(num-1)
end if
end function
Provala e aggiungi la gestione degli errori dato che con i fattoriali che è
facile andare in overflow. Ho usato il tipo decimal appunto perchè gestisce
numeri grossi.
Namor
L'ho provata, funziona - grazie.
Comunque con Access2003 non è più possibile la definizione
Decimal (si può solo usare nell'ambito di Variant con CDec(Variant)).
Così recita l'Help.
Definendo Double si arriva a 170! -- ti lascio immaginare
però con quale precisione.
Penso che per piccoli (ma precisi) calcoli occorra usare
il tipo Long (tiene fino a 17!).

Ciao
Bruno

PS
Comunque -- generally speaking -- la matematica
di VB e VBA è proprio uno schifo!
namor
2004-09-09 16:27:56 UTC
Permalink
"Bruno Campanini" <***@tin.it> ha scritto nel messaggio
news:0K_%c.286438

[cut]
Post by Bruno Campanini
Post by namor
Post by Bruno Campanini
Sai che esista in Access la funzione Fattoriale (n!).
Non riesco a trovarla.
Bruno
Che io sappia non esiste ma la puoi scrivere in un modulo in poche righe se
public function fattoriale(Num as integer) as decimal
if num<0 then fattoriale=0
if num=1 or num=0 then
fattoriale=1
else
fattoriale=num*fattoriale(num-1)
end if
end function
Provala e aggiungi la gestione degli errori dato che con i fattoriali
che
Post by Bruno Campanini
Post by namor
è
facile andare in overflow. Ho usato il tipo decimal appunto perchè gestisce
numeri grossi.
Namor
L'ho provata, funziona - grazie.
Comunque con Access2003 non è più possibile la definizione
Decimal (si può solo usare nell'ambito di Variant con CDec(Variant)).
Così recita l'Help.
Definendo Double si arriva a 170! -- ti lascio immaginare
però con quale precisione.
Penso che per piccoli (ma precisi) calcoli occorra usare
il tipo Long (tiene fino a 17!).
Ciao
Bruno
PS
Comunque -- generally speaking -- la matematica
di VB e VBA è proprio uno schifo!
Ci sarà un'alternativa. Vedi sull'help "Riepilogo dei tipi di dati".
Il fattoriale è un numero intero quindi anche coi Double non dovresti avere
problemi di precisione.
Namor
Bruno Campanini
2004-09-09 18:00:53 UTC
Permalink
Post by namor
Ci sarà un'alternativa. Vedi sull'help "Riepilogo dei tipi di dati".
Il fattoriale è un numero intero quindi anche coi Double non dovresti avere
problemi di precisione.
Namor
Quando dopo aver fatto 100 volte S = S +.01
e avendo chiesto se S = 1 ottieni False
l'alternativa è solo il pallottoliere.

Bruno
namor
2004-09-10 06:18:59 UTC
Permalink
Post by Bruno Campanini
Post by namor
Ci sarà un'alternativa. Vedi sull'help "Riepilogo dei tipi di dati".
Il fattoriale è un numero intero quindi anche coi Double non dovresti
avere problemi di precisione.
Namor
Quando dopo aver fatto 100 volte S = S +.01
e avendo chiesto se S = 1 ottieni False
l'alternativa è solo il pallottoliere.
Bruno
Infatti ti ho detto che coi numeri interi non dovresti avere problemi.
Le imprecisioni sui decimali sono note.
Namor
--
namor at inwind punto it

questo articolo e` stato inviato via web dal servizio gratuito
http://www.newsland.it/news segnala gli abusi ad ***@newsland.it
AEOM
2004-09-09 12:17:55 UTC
Permalink
Post by Bruno Campanini
Post by AEOM
Che mi servivano l'avevo capito....hai un algoritmo già pronto da postare?
ciao, AEOM
Private Sub Command0_Click()
Dim i As Integer, j As Integer, k As Integer
Dim MyArray(1 To 5) As Integer, n As Integer
MyArray(1) = 10
MyArray(2) = 15
MyArray(3) = 20
MyArray(4) = 25
MyArray(5) = 30
n = 0
For i = 1 To 3
For j = i + 1 To 5
For k = j + 1 To 5
n = n + 1
Debug.Print n, MyArray(i); MyArray(j); MyArray(k)
Next k
Next j
Next i
End Sub
Ciao
Bruno
grazie Bruno ma se volessi parametrizzare il numero delle palle estratte?
tornando all'esempio del lotto, vorrei fosse flessibile per le richieste di
tutti i possibili ambi, terne quaterne ottenibili dalla serie iniziale

e' fattibile?

ciao, AEOM
Bruno Campanini
2004-09-09 15:39:25 UTC
Permalink
Post by AEOM
grazie Bruno ma se volessi parametrizzare il numero delle palle estratte?
tornando all'esempio del lotto, vorrei fosse flessibile per le richieste
di tutti i possibili ambi, terne quaterne ottenibili dalla serie iniziale
e' fattibile?
Con quattro procedure (Ambo, Terno, Quaterna, Cinquina)
è un gioco da ragazzi.
La faccio con unica funzione, poi ti racconto.

Bruno
Bruno Campanini
2004-09-09 23:57:57 UTC
Permalink
Post by AEOM
grazie Bruno ma se volessi parametrizzare il numero delle palle estratte?
tornando all'esempio del lotto, vorrei fosse flessibile per le richieste
di tutti i possibili ambi, terne quaterne ottenibili dalla serie iniziale
e' fattibile?
ciao, AEOM
Ti ho inviato all'indirizzo personale un piccolo mdb
(20 kb .zip) col codice per ambi, terni etc, ma il tuo server l'ha
rifiutato.

Ciao
Bruno
AEOM
2004-09-10 06:17:18 UTC
Permalink
Post by Bruno Campanini
Post by AEOM
grazie Bruno ma se volessi parametrizzare il numero delle palle estratte?
tornando all'esempio del lotto, vorrei fosse flessibile per le richieste
di tutti i possibili ambi, terne quaterne ottenibili dalla serie iniziale
e' fattibile?
ciao, AEOM
Ti ho inviato all'indirizzo personale un piccolo mdb
(20 kb .zip) col codice per ambi, terni etc, ma il tuo server l'ha
rifiutato.
Ciao
Bruno
Ciao Bruno,
l'indirizzo è falso altrimenti chi mi salva dallo spam.
puoi postare il codice qui ?

ciao, AEOM
Bruno Campanini
2004-09-10 09:20:59 UTC
Permalink
Post by AEOM
Ciao Bruno,
l'indirizzo è falso altrimenti chi mi salva dallo spam.
puoi postare il codice qui ?
ciao, AEOM
OK, eccolo di seguito.
La chiamata la fai con:

MyArray(1) = 10
MyArray(2) = 20
MyArray(3) = 30
MyArray.............
Comb MyArray, 2 | 3 | 4 | 5

Se trovi qualche bug avvisami.
Ciao
Bruno

Public Sub Comb(ArrayElementi(), ClasseCombinazione As Integer)
' ArrayElementi contiene gli elementi da combinare -- Numeri, Stringhe, etc.
' ClasseCombinazione = 2 ---> Ambo
' ClasseCombinazione = 3 ---> Terno
' ClasseCombinazione = 4 ---> Quaterna
' ClasseCombinazione = 5 ---> Cinquina

Dim i As Integer, j As Integer, k As Integer, l As Integer, p As Integer
Dim NumComb As Long, n As Integer, collComb As New Collection

n = UBound(ArrayElementi)
NumComb = 0

Select Case ClasseCombinazione
Case 2
GoSub Ambo
Case 3
GoSub Terno
Case 4
GoSub Quaterna
Case 5
GoSub Cinquina
Case Else
MsgBox "Sono ammessi:" & vbCrLf & vbLf & _
"2 ---> Ambo" & vbCrLf & _
"3 ---> Terno" & vbCrLf & _
"4 ---> Quaterna" & vbCrLf & _
"5 ---> Cinquina"
Exit Sub
End Select

For i = 1 To collComb.Count
Debug.Print i, collComb.Item(i)
Next i
'----------------------------------------
Exit Sub
'----------------------------------------

Ambo:
'----
For i = 1 To n - ClasseCombinazione + 1
For j = i + 1 To n
NumComb = NumComb + 1
collComb.Add ArrayElementi(i) & Space(2) & ArrayElementi(j)
Next j
Next i
Return

Terno:
'-----
For i = 1 To n - ClasseCombinazione + 1
For j = i + 1 To n - 1
For k = j + 1 To n
NumComb = NumComb + 1
collComb.Add ArrayElementi(i) & Space(2) & ArrayElementi(j) & _
Space(2) & ArrayElementi(k)
Next k
Next j
Next i
Return

Quaterna:
'--------
For i = 1 To n - ClasseCombinazione + 1
For j = i + 1 To n - 2
For k = j + 1 To n - 1
For l = k + 1 To n
NumComb = NumComb + 1
collComb.Add ArrayElementi(i) & Space(2) & ArrayElementi(j)
& _
Space(2) & ArrayElementi(k) & Space(2) & ArrayElementi(l)
Next l
Next k
Next j
Next i
Return

Cinquina:
'--------
For i = 1 To n - ClasseCombinazione + 1
For j = i + 1 To n - 3
For k = j + 1 To n - 2
For l = k + 1 To n - 1
For p = l + 1 To n
NumComb = NumComb + 1
collComb.Add ArrayElementi(i) & Space(2) &
ArrayElementi(j) & Space(2) & _
ArrayElementi(k) & Space(2) & ArrayElementi(l) &
Space(2) & ArrayElementi(p)
Next p
Next l
Next k
Next j
Next i
Return

End Sub

Bruno Campanini
2004-09-09 10:37:29 UTC
Permalink
Post by MA
Caruccio l'indirzzo...
Post by AEOM
Ciao a tutti
ho bisogno di permutare N cifre prese K alla
volta (K<=N) senza
Post by AEOM
ripetizioni, qualcuno ha del codice da postarmi
Credo dovresti schiarirti prima un po' le idee su alcuni elementi
di analisi combinatoria.

Dati 3 elementi a, b, c.

Disposizioni di n elementi ad m ad m (m<n) sono in numero di n!/(n-m)!
Due raggruppamenti differiscono per un elemento o per l'ordine
in cui gli elementi sono disposti.
Dn,m = n!/(n-m)!
D3,2 = 6 = ab, ba, ac, ca, bc, cb

Le Disposizioni dove n=m divengono Permutazioni
di n elementi dove Pn = n!
P3 = 6 = abc, acb, bac, bca, cab, cba

Se nelle Disposizioni sopra ottenute considero diversi
due raggruppamenti che differiscano almeno per un elemento
ottengo le Combinazioni di n elementi ad m ad m (m<n).
Cn,m = n!/m!(n-m)!
C3,2 = 3 = ab, ac, bc

Esistono anche Disposizioni, Permutazioni e Combinazioni
con ripetizione ma mi pare che la "ripetizione" non ti interessi.

Dunque qual è la tua scelta:
D3,2 = 6 = ab, ba, ac, ca, bc, cb?
P3 = 6 = abc, acb, bac, bca, cab, cba?
C3,2 = 3 = ab, ac, bc?

Ciao
Bruno
AEOM
2004-09-09 11:01:41 UTC
Permalink
Post by Bruno Campanini
Post by MA
Caruccio l'indirzzo...
Post by AEOM
Ciao a tutti
ho bisogno di permutare N cifre prese K alla
volta (K<=N) senza
Post by AEOM
ripetizioni, qualcuno ha del codice da postarmi
Credo dovresti schiarirti prima un po' le idee su alcuni elementi
di analisi combinatoria.
Dati 3 elementi a, b, c.
Disposizioni di n elementi ad m ad m (m<n) sono in numero di n!/(n-m)!
Due raggruppamenti differiscono per un elemento o per l'ordine
in cui gli elementi sono disposti.
Dn,m = n!/(n-m)!
D3,2 = 6 = ab, ba, ac, ca, bc, cb
Le Disposizioni dove n=m divengono Permutazioni
di n elementi dove Pn = n!
P3 = 6 = abc, acb, bac, bca, cab, cba
Se nelle Disposizioni sopra ottenute considero diversi
due raggruppamenti che differiscano almeno per un elemento
ottengo le Combinazioni di n elementi ad m ad m (m<n).
Cn,m = n!/m!(n-m)!
C3,2 = 3 = ab, ac, bc
Esistono anche Disposizioni, Permutazioni e Combinazioni
con ripetizione ma mi pare che la "ripetizione" non ti interessi.
D3,2 = 6 = ab, ba, ac, ca, bc, cb?
P3 = 6 = abc, acb, bac, bca, cab, cba?
C3,2 = 3 = ab, ac, bc?
Ciao
Bruno
mi sembra che l'esempio sia chiaro
da un urna con 5 palle numerate voglio sapere tutte le possibili
combinazioni estraendo 3 palle alla volta, stile lotto o sorteggio
champizionsz lig (alla Galeazzi)

grazie comunque per la rispolverata alla analisi combinatorio purtroppo ho
beccato solo 22 all'esame
anni e anni fa

ciao, AOEM
Loading...