Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2003
    Messaggi
    323

    [c++] funzione ricorsiva

    ciao

    mi servirebbe una funzione ricorsiva per stabilire se una stringa è palindroma o meno.

    io ho fatto questo però mi da qualche problema:

    codice:
    bool is_palindrome(string s)
    {
         if(s.length()<=1)
         {
          return true;
         }
         else
         {
          int start=0;
          int end=s.length()-1;
          if(s[start]!=s[end])
          return false;
          else
          {
            while(start<end){
            start++;
            end--;
            is_palindrome(s);
            }
          }
         }


    Qualcuno sa come risolvere? in questo modo mi confronta solo la prima ed ultima lettera e non va oltre.


    Grazie
    someone told me
    love would all save us
    but how can that be
    look what love gave us

  2. #2
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Il problema dovrebbe essere che ridichiari start e end nel metodo ogni volta, io ho provato questo e funziona:
    codice:
    bool is_palindrome(string s,int start,int end)
    {
         if(s.length()<=1)
         {
          return true;
         }
         else
         {
          if(s[start]!=s[end])return false;
          else
          {
            while(start<end){
            start++;
            end--;
            is_palindrome(s,start,end);
            }
          }
        }
    }
    Ciao
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  3. #3
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Alternativamente puoi dichiarare star e end membri STATIC:
    codice:
    bool is_palindrome(string s)
    {
         if(s.length()<=1)
         {
          return true;
         }
         else
         {
          static int start=0;
          static int end=s.length()-1;
          if(s[start]!=s[end])
          return false;
          else
          {
            while(start<end){
            start++;
            end--;
            is_palindrome(s);
            }
          }
         }
    }
    Ciao
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  4. #4
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    C'è un altro errore...non c'è la condizione di uscita dalla ricorsione nel caso in cui uno dei confronti tra le lettere sia sbagliato, la versione giusta dovrebbe essere questa:
    codice:
    bool is_palindrome(string s)
    {
         if(s.length()<=1)
         {
          return true;
         }
         else
         {
          static int start=0;
          static int end=s.length()-1;
          cout << start <<"  "<<end <<endl;
          if(s[start]!=s[end])return false;
          else
          {
            while(start<end){
            start++;
            end--;
            if(is_palindrome(s)==false)return false;
            }
          }
         }
    }
    Ariciao
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2003
    Messaggi
    323
    Ho risolto, ho fatto così e va alla grande.
    Controllate anche voi se va bene?

    codice:
    bool is_palindrome(string& s)
    {
    if(s.length()-1<=1)
    return true;
    else{
          if(s[0]!=s[s.length()-1])
          return false;
          else
          {
          s.erase(0,1);
          s.erase(s.length()-1,1);
            is_palindrome(s);
            }
      }
         }
    someone told me
    love would all save us
    but how can that be
    look what love gave us

  6. #6
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Anche in questo caso ti sei dimenticato l'uscita dalla ricorsione, il programma restituisce sempre true, modificalo così:
    codice:
    bool is_palindrome(string s)
    {
    if(s.length()-1<=1)
    return true;
    else{
          if(s[0]!=s[s.length()-1])
          return false;
          else
          {
            s.erase(0,1);
            s.erase(s.length()-1,1);
            if(is_palindrome(s)==false)return false;
          }
      }
    }
    Ciao
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  7. #7
    Altra versione, forse piu compatta
    codice:
    bool is_palindrome(std::string& s)
    {
    	if (s.length() <= 1)
    		return true;
    	if (*(s.begin()) == *(s.rbegin()))
    	{		
    		s.erase(s.begin());
    		s.erase(s.end()-1);
    		return is_palindrome(s);
    	}
    	return false;
    }

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 © 2025 vBulletin Solutions, Inc. All rights reserved.