Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    182

    [C++] Esercizio funzione ricorsiva: somma pari e dispari alternata

    Si scriva in C++ una funzione ricorsiva che riceva un array di numeri interi e la sua dimensione e restituisca TRUE se le somme di due interi consecutivi nell’array sono alternatamente una pari ed una dispari, ossia comunque si prenda un intero x nell’array, se la somma di x con l’intero che lo precede è pari (risp. dispari), la somma di x con l’intero che lo segue deve essere dispari (risp. pari). Esempio: la funzione invocata su un array contenente la sequenza di interi 1 3 2 6 3 3 2 dovrà restituire TRUE. Infatti le somme degli interi consecutivi sono 1+3 - pari, 3+2 – dispari, 2+6 – pari, 6+3 – dispari, 3+3 – pari, 3+2 – dispari.
    Specificare quale deve essere la prima invocazione per la funzione.


    La mia bozza di soluzione è:

    codice:
    bool parialternati(int M[], int dim, int i){
         
         if(dim%2==0) //passo base
         return false;
         
         
         if(M[i] + M[i+1]%2==0 && M[i+2] + M[i+3]%2!=0) //passo ricorsivo
         return true;
         
         return parialternati(M[], dim, ++i);
         }
         
         
        La prima invocazione per la funzione deve essere:
               parialternati(M, dim, 1);

    Cosa sbaglio? C'è un altro modo per farlo senza far camminare l'indice i di cosi' tanto?

  2. #2

    Re: [C++] Esercizio funzione ricorsiva: somma pari e dispari alternata

    Originariamente inviato da mistergks
    Cosa sbaglio?
    Di sicuro il passo base.
    Originariamente inviato da mistergks
    C'è un altro modo per farlo senza far camminare l'indice i di cosi' tanto?
    Si, pensaci bene..

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    182
    il passo base non so proprio come fare per individuarlo..
    per quello ricorsivo va bene se faccio scorrere l'indice ogni 2? cioè incremento di 2??

  4. #4
    Originariamente inviato da mistergks
    il passo base non so proprio come fare per individuarlo..
    Ragiona sul fatto che devi scorrere per intero l'array e quindi al di fuori di [0, dim) non puoi andare.
    Originariamente inviato da mistergks
    per quello ricorsivo va bene se faccio scorrere l'indice ogni 2? cioè incremento di 2??
    In questo caso ti conviene far partire l'indice da 1 ed incrementarlo progressivamente di una sola unità.

    P.S. Nella segnatura della tua funzione manca un parametro.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    182
    Ho corretto il passo base e ho cambiato la condizione dell'if perchè anche la seconda espressione deve sommare M[i+1].
    Qual'è il parametro che manca?! Non mi sembra .. ho messo la matrice M, la sua dimensione e l'indice i.


    codice:
    bool parialternati(int M[], int dim, int i){
         
         if(i==dim) //passo base
         return false;
         
         
         if(M[i] + M[i+1]%2==0 && M[i+1] + M[i+2]%2!=0) //passo ricorsivo
         return true;
         
         return parialternati(M[], dim, ++i);
         }
         
         
        La prima invocazione nel main per la funzione deve essere:
               parialternati(M, dim, 1);
    Come prima invocazione ho assegnato i a 1 passando un 1 direttamente nella funzione. Cosi' facendo non bisogna obbligatoriamente specificare i=1 nell'inizializzazione del main, vero?

  6. #6
    Originariamente inviato da mistergks
    Ho corretto il passo base e ho cambiato la condizione dell'if perchè anche la seconda espressione deve sommare M[i+1].
    Qual'è il parametro che manca?! Non mi sembra .. ho messo la matrice M, la sua dimensione e l'indice i.
    Innanzitutto M non è una matrice, bensì un array.
    Poi la soluzione non è effettivamente corretta: se M fosse grande 3 otterresti un errore a run time, quindi puoi trovare sicuramente una soluzione diversa.
    Terza cosa: per come hai definito la funzione, l'indice i deve partire da 0, altrimenti non verifichi la prima somma.

    Per quanto riguarda il parametro aggiuntivo, penso sia meglio esplicitare (usando appunto un parametro) come la sequenza di resti deve iniziare, perchè la traccia dice:
    Specificare quale deve essere la prima invocazione per la funzione.

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    182
    Originariamente inviato da VincenzoTheBest
    Innanzitutto M non è una matrice, bensì un array.
    E' vero!l' ho chiamata matrice per cattiva abitudine...ma so che la matrice è formata da righe e colonne mentre questo array ha solo una riga... sorry!

    Poi la soluzione non è effettivamente corretta: se M fosse grande 3 otterresti un errore a run time, quindi puoi trovare sicuramente una soluzione diversa.
    Cosa dovrei fare? un controllo con un if cosi magari?:
    codice:
    if(dim<4)
    return false;
    Terza cosa: per come hai definito la funzione, l'indice i deve partire da 0, altrimenti non verifichi la prima somma.
    Ah è vero!

    Per quanto riguarda il parametro aggiuntivo, penso sia meglio esplicitare (usando appunto un parametro) come la sequenza di resti deve iniziare, perchè la traccia dice:
    Ma cosa si intende per prima invocazione? La traccia vuole sapere come viene chiamata la funzione nel main? o Cosa? non ho ben capito!

  8. #8
    Originariamente inviato da mistergks
    Cosa dovrei fare? un controllo con un if cosi magari?
    Cerca di confrontare al più due celle, e non quattro.
    Originariamente inviato da mistergks
    Ma cosa si intende per prima invocazione? La traccia vuole sapere come viene chiamata la funzione nel main? o Cosa? non ho ben capito!
    Non so, io ho dato quella interpretazione.

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    182
    Non riesco ad arrivarci...se confronto solo due celle come faccio a dire che la prima somma deve essere pari e la seconda dispari?!

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    182
    up

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.