Dubbio su esercizio combinazione +-

di Anonimizzato31661 il
8 risposte
Buonasera,
Stavo affrontando un esercizio, che incollo qui sotto:
Scrivere un programma che chiede all’utente un numero intero n positivo e poi visualizza tutte le combinazioni di
lunghezza n costituite da sequenze di simboli ’+’ e ’-’. L’ordine delle combinazioni e a piacere. `
Esempio 1
Ingresso: 3
Uscita: +++ ++- +-+ +-- -++ -+- --+ ---
Esempio 2
Ingresso: 2
Uscita: ++ +- -+ --
Ho pensato di risolverlo attraverso un ciclo for che va da 0 a e2^n -1, ma non saprei che istruzioni inserire all'interno del for.
Vi sarei molto grata se potreste scrivermi la soluzione(senza utilizzo di sottoprogrammi di libreria poichè non consetiti) spiegandomi i vari passaggi(non sono ancora molto bravo a progrmmare ma mi piacerebbe imparare e capire).
Cordiali saluti,
G

8 Risposte

  • Ciao, dal punto di vista strettamente matematico non si tratta di combinazioni, ma di disposizioni con ripetizione, il cui numero infatti si calcola come D'(n,k)=n^k.
    Per ottenere l'elenco delle singole disposizioni con ripetizione di classe k e di n elementi, basta implementare una funzione che somma 1 ad un numero in base n costituito da k cifre. Mi spiego meglio con alcuni esempi:
    D'(3,2) = 9:
    
    1) 0 0
    2) 0 1
    3) 0 2
    4) 1 0
    5) 1 1
    6) 1 2
    7) 2 0
    8) 2 1
    9) 2 2
    oppure rifacendomi al tuo primo esempio:
    D'(2,3) = 8:
    
    1) 0 0 0
    2) 0 0 1
    3) 0 1 0
    4) 0 1 1
    5) 1 0 0
    6) 1 0 1
    7) 1 1 0
    8) 1 1 1
    Se hai qualche dubbio chiedi pure.
  • Ciao!
    Grazie infinite per la risposta!
    Non sono ancora molto pratico con il C, e onestamente non saprei proprio come implementare la funzione...
    Potresti perfavore scrivermela?
    Io arrivo a
    for(i=0; i<2^n; i++) // due perchè due simboli giusto? ed n è il numero inserito dall'utente
    tmp=-1;
    for(j=0; j<n; j++)
    tmp=tmp+1;
    printf("%d\n", tmp);
  • Premesso che in C l'operatore ^ non costituisce l'elevamento a potenza, va detto che il codice che hai scritto non ha molto senso, così come non avrebbe molto senso scriverti la soluzione...

    In ogni caso hai capito il ragionamento che ho fatto nel precedente post? Sì, ma vista la scarsa conoscenza del linguaggio non sai tradurlo in C, oppure no? Per esempio se ti dicessi di scrivermi l'elenco delle 64 (magari anche non tutte) disposizioni con ripetizione D'(4,3) sapresti farlo?


    P.S.
    Si tratta di un esercizio scolastico oppure di un tuo tentativo da autodidatta?
  • Buonasera!
    Scusami per la tarda risposta, in questi giorni ho provato a implementare la dfunzione ma non riesco proprio a scrivere il codice. L'esercizio è scolastico (tratto da un tema d'esame di un corso universitario). Ho compreso il tuo ragionamento, ma il mio grande è la stesura del codice.
    G
  • Proverei cosi.

    Ti fai dare il numero di elementi. (ipotizziamo 4.)
    Ottieni le combinazioni combinazioni che servono, (ipotizziamo 16, 2^4)
    Ciclo da 0 a 15 e stampi i numeri in binario, solo che non metti "0"e"1" ma "+"e"-"
  • For(i=1; i<=n; i++){
    pot=pot*2;
    }

    for(i=0; i<pot; i++){
    for(j=i; j>0; j++){
    if(j%2==0){
    printf("+");

    } else{
    printf("-");
    }
    j=j/2;
    }

    Penso che sia questo l'algoritmo finale (grazie mille per il suggerimento di utilizzare il binario). Ancora non visualizzo il risultato corretto però... potrebbe essere un erore il mondo in cui ho trovato la potenza di due?
  • A parte qualche rifinitura direi che è giusto.

    mi sono permesso di partire dal tuo progetto per proporre un idea ( se sei nuovo al c, con tranello )
    lo scanf finale è solo per fermare l'esecuzione e fare in modo che la finestra non venga chiusa.
    [CODE] #include <stdio.h> int main() { int i,j,k; int n=4,pot=1; for(i=1; i<=n; i++) pot=pot*2; for(i=0; i<pot; i++) { k=i; for(j=0; j<4;j++ ) { printf("%c",'-'-2*(k&1)); k=k/2; } printf("\n"); } scanf("%d",&i); }
  • Io invece mi riferivo ad una soluzione più generale di questo tipo:
    #include <stdio.h>
    
    #define N 4
    #define K 3
    
    char w[N] = {'A', 'B', 'C', 'D'};
    
    int disposizione_R_successiva(unsigned int *v)
    {
        for(unsigned int i = 0; i < K; ++i)
        {
            if(v[K - 1 - i] < N - 1)
            {
                ++v[K - 1 - i];
                for(unsigned int j = K - i; j < K; v[j++] = 0);
                return 1;
            }
        }
        return 0;
    }
    
    void stampa_sequenza(const unsigned int *v)
    {
        for(unsigned int i = 0; i < K; ++i)
        {
            printf("%c", w[v[i]]);
        }
        printf("\n");
    }
    
    
    int main()
    {
        unsigned int v[K] = {0};
        unsigned int n = 0;
        do
        {
            printf("%u:\t", ++n);
            stampa_sequenza(v);
        }
        while(disposizione_R_successiva(v));
        return 0;
    }
    Ovviamente per il caso in esame bisogna porre N=2, K=3 e w={'+','-'}.
Devi accedere o registrarti per scrivere nel forum
8 risposte