Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    33

    c++ palindromo a coppie

    Salve ho questo problema:

    Esercizio 2. Si scriva in C++ una funzione ricorsiva che riceva un array di interi e la sua dimensione (che si sa essere
    sempre PARI) e restituisca VERO se l’array è palindromo “a coppie”. Un array si dice “palindromo a coppie” se è palindromo,
    ma rispetto a coppie contigue di elementi, e non a singoli elementi.
    Es.:
    4 7 5 2 5 2 4 7


    Io ho implementato il seguente codice e l'ho rivisto un milione di volte e non capisco dov'è il problema perche mi dovrebbe ristituire È PALINDROMO A COPPIE, invece mi dice di no.

    grazie come sempre per l'aiuto

    codice:
    # include <iostream>
    using namespace std;
    bool verifica (int [], int ,int );
    const int n=8;
    
    int main ()
    {
    	int a[n]={4,7,5,2,5,2,4,7};
    	
    	
    	
    	if (verifica (a,0,n-1))
    	cout<<"E PALINDROMO A COPPIE"<<endl;
    	else
    	cout<<"NON E PALINDROMO A COPPIE";
    	
    return 0;	
    }
    
    bool verifica (int a[], int i,int j)
    {
    	if (i==n/2-1 && j==n/2)
    	return true;
    	
    	if (a[i] != a[j-1] ||   a[i+1] != a[j])
    	return false;
    	
    	return verifica (a,i+2,j-2);
    }

  2. #2
    Utente di HTML.it L'avatar di ganesha
    Registrato dal
    Jan 2003
    Messaggi
    357
    Ciao, probabilmente è sbagliata questa condizione: if (i==n/2-1 && j==n/2)

    Prova ad invertirla: if (i==n/2 && j==n/2-1)


  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    33
    grazieeeeee mi ero confuso

  4. #4
    Utente di HTML.it L'avatar di ganesha
    Registrato dal
    Jan 2003
    Messaggi
    357

    Re: c++ palindromo a coppie

    La modifica che ti ho proposto funziona solo se le coppie sono pari.

    Così invece funziona anche se le coppie sono dispare (es. n=10):

    codice:
    # include <iostream>
    using namespace std;
    bool verifica (int [], int ,int );
    const int n=8;
    
    int main ()
    {
    	int a[n]={4,7,5,2,5,2,4,7};
    	
    	
    	
    	if (verifica (a,0,n-1))
    	cout<<"E PALINDROMO A COPPIE"<<endl;
    	else
    	cout<<"NON E PALINDROMO A COPPIE";
    	
    return 0;	
    }
    
    bool verifica (int a[], int i,int j)
    {
    	if (i > j)
    	return true;
    	
    	if (a[i] != a[j-1] ||   a[i+1] != a[j])
    	return false;
    	
    	return verifica (a,i+2,j-2);
    }

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    33
    scusa la mia ignoranza, ho provato come dici tu e funziona , ma mi potresti spiegare perche l'indice i lo devo mettere a n/2?, n/2 sarebbe 4 come indice cioè il numero a[i]=5, invece noi vogliamo che si fermi a a[i]=2 e la stessa cosa vale per j, non capisco perche non ci fermiamo dove ci interessa se no che andiamo uno in piu.
    grazie

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    devi fare in tutto n/2 controlli.
    Parti da 0 e (per una prova di linearità fatta da me) da n-2 e richiami ricorsivamente andando avanti di due per il primo indice, indietro di 2 per il secondo.
    Ora nel caso in cui il primo indice supera il secondo (cioè sei arrivato a 6 e il secondo è 4) devi ovviamente fermarti. Ecco il controllo a maggiore.

    Fare il controllo come dici tu (con la dimensione) significa fermarti a indice = dimensione/2 in entrambi i casi, sia che indice sia il primo o il secondo. Diciamo che questa versione è migliore (nel senso più lineare)

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.