Dubbio su esercizio combinazione +-

di il
8 risposte

Dubbio su esercizio combinazione +-

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

  • Re: Dubbio su esercizio combinazione +-

    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.
  • Re: Dubbio su esercizio combinazione +-

    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);
  • Re: Dubbio su esercizio combinazione +-

    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?
  • Re: Dubbio su esercizio combinazione +-

    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
  • Re: Dubbio su esercizio combinazione +-

    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"-"
  • Re: Dubbio su esercizio combinazione +-

    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?
  • Re: Dubbio su esercizio combinazione +-

    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); }
  • Re: Dubbio su esercizio combinazione +-

    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