Newsgroup: it.comp.lang.visual-basic
Titolo: Generare una sequenza di numeri.

Sono in difficolta`. 
Vorrei realizzare un loop che mi generi una sequenza di combinazioni di
numeri con il seguente criterio:
Dato un numero n, tutte le diverse combinazioni di qualsiasi lunghezza che
contengano solo una volta lo stesso numero. 
Potrebbe non essere chiaro: faccio un esempio con n=5
1,2,3,4,5,12,13,14,15,23,24,25,34,35,45,123,124,125,134,135,145,234,235,245,345,1234,1235,1245,1345,2345,12345
sperando di non aver dimanticato qualche combinazione.
Purtroppo non ho cultura al riguardo, ma sono sicuro che esiste una formula
che mi dica quante sono le combinazioni in funzione di n.
Qualcuno ha gia` incontrato doc al riguardo o ha gia` realizzato qualcosa
di simile?
--
Ciao,
      Peppo
 
ICQ    : UIN 5709387
Fidonet: 2:331/301.45

 wrote in message
3q8n3s89so2cic3g2...@4ax.com...


1 lavori con i caratteri e non con i numeri
2 Se n sono le cifre tu utilizzi n+1 caratteri in cui il carattere in più è ad
esempio il $
3 Ti fai un tipo enum che contiene gli n+1 caratteri
4 Fai N+1 cicli for annidati che vanno da 1 (il primo carattere) a n+1(l'ultimo
carattere),
    ad ogni valore corrispondente dell'indice dei cicli for sostituisci il
corrispettivo carattere del tipo enum e quindi hai una variabile stringa di n+1
caratteri
    e per ogni ciclo l'assegni questa variabile ad un array che quindi
necessariamente deve essere di dimensione  (n+1)^2
5 Ottenuta l'array ti fai un ciclo for da 1 all'ultima cifra(n) ed elimini tutte
le stringhe che hanno due volte il carattere(numero)
    corrispondente all'indice nell'insieme enum
6 Tutte le stringhe delle array che ti sono rimaste non ripetono mai due volte
la stessa cifra però hanno il $, tu devi semplicemente troncare le varie
    stringhe dal $ in poi verso destra: così ottieni quello che desideri
sottoforma di stringa
7 Converti le stringhe in numeri se è il formato numerico quello che ti
interessa.
Questa è la soluzione computazionalmente più dispendiosa...
per qualcosa di meglio ci si deve pensare.


non ho capito...
no dai, stai scherzando?
sono stato cosi poco chiaro da non permetterti di fare la benche`
supposizione?
Supponiamo di fare una routine in cui l'input e` un numero (nell'esempio
sotto sarebbe 5 e l'output un file di testo piuttosto che una print in cui
in ciascuna riga c'e` una delle possibili combinazioni.
Purtroppo non possiedo la giusta terminologia: se la conoscessi
probabilmente basterebbe una sola parola per definire cio` che mi e` cosi
difficile spiegare.
Mi basterebbe che qualcuno che e` riuscito ad intuire cio` che voglio dire,
mi dicesse il nome dell'algoritmo in modo che poi possa fare ricerche al
riguardo.
Riprovo con un esempio con lettere e piu` semplice e magari scatta la molla
che vi permette di capire il mio problema.
Anziche` dire che il numero come parametro di input e` 3 usiamo le lettere
A, B e C.
Le possibili combinazioni sarebbero:
A
B
C
A B
A C
B C
A B C
Ovviamente se anziche` A B scrivo B A, e` la stessa cosa e visto che
ciascuna lettera puo` comparire nella sequenza una sola volta non penso
esistano date A, B, C altre combinazioni possibili.
Se aumentiano il numero ovviamente aumentano anche le combinazioni. 
Ad esempio, nel mio messaggio precedente puoi sostituire ai numeri 1,2,3,4
e 5 le lettere A, B, C, D e E 


per qualcosa di meglio ci si deve pensare.
ok! Andiamo di borza bruta ;-)
+o- ho capito il concetto, vado a mettere in pratica :-)
Grazie!


ho sbagliato una cosa, l'array
non deve essere di (n+1)^2  elementi ma bensì di
(n+1)^(n+1)
Perdon!

On/Il Sun, 28 Nov 1999 23:03:44 +0100, 
gdf....@flashnet.it
 wrote/scrisse:

ti ringrazio. Sto cm battendo un'altra strada: mi e` stato mandato un
routinetta che funziona anche se e` molto lenta.
Ora devo pero` trovare il tempo di mettere in pratica una deduzione per
creare il loop per determinare le possibili conmbinazioni e che, se non
nasconde particolari trappole, potrebbe essere geniale.
Le combinazioni non dovrebbero essere altro che creando un numero binario
di n cifre e incrementandolo step by step. Vedendo dove sono gli 1 ottieni
le combinazioni.
Appena avro realizzato questo mio piccolo sfizio mando la routine a tutti
quelli che hanno corrisposto con me.
Grazie a te e a tutti gli altri.



1,2,3,4,5,12,13,14,15,23,24,25,34,35,45,123,124,125,134,135,145,234,235,245,
345,1234,1235,1245,1345,2345,12345
Le sequenze prive di ripetizioni di "k" elementi di un insiemi di "n"
elementi si dicono "combinazioni di n elementi presi k per volta". Le
sequenze di "k" elementi di un insieme di "n" elementi possono essere viste
come le applicazioni (funzioni) da un insieme di "k" elementi a uno di "n"
elementi, e le combinazioni sono le applicazioni "iniettive".
L'analisi combinatoria dice che che tali funzioni sono n!/k!/(n - k)!, dove
il punto esclamativo indica l'operazione di fattoriale. Per esempio, le
combinazioni di 5 elementi presi 2 per volta sono 5! / 2! / 3! =  120 / 2 /
6 = 10. Esse sono: 12, 13, 14, 15, 23, 24, 25, 34, 35, 45.
Per generarle, occorre usare un array di contatori di ciclo. E' un po' come
contare (quando una cifra raggiunge il 9, viene azzerata e incrementa la
cifra successiva), con la differenza che le cifre invece di azzerarsi
partono dal successivo della cifra precedente.
Spero di avere aiutato.

Informo gli "appassionati" di calcolo combinatorio che ho recentemente
inviato al Sito Comune un programmino in VB6 (tradotto da una mia
preistorica routine in assembler) per generare la lista delle combinazioni
semplici di N oggetti presi a gruppi di K, con N e K variabili.
Viene cosi' evitata la necessita' di usare N loops nidificati con conseguente
rigidita' del risultato.
Ciao e buon lavoro a tutti.
(e anche Buone Feste!!!)
Franco
