Palindrom, zwracanie wartości.

0
#include <iostream>
using namespace std;

int k=0;
bool palindrom(string slowo, int poczatek, int koniec, int srodek){

if (k==srodek){
return true;}

else if (slowo[poczatek]==slowo[koniec-1] and k<srodek)
{
k++;
palindrom(slowo, poczatek+1, koniec-1, srodek); 
}
else return false; 
}

int main()
{
string podane_slowo;
int koniec, srodek, poczatek=0;
cout<<"Podaj slowo \n";
cin>>podane_slowo;
koniec=podane_slowo.length();
srodek=koniec/2;

if (palindrom(podane_slowo, poczatek, koniec, srodek)==false){
cout<<"To nie jest palindrom\n";}
else { cout<<"To jest palindrom!\n";}

system("pause");
return 0;
}

Dla słowa np
ax..........ba

pokaże, że to jest palindrom. Dlaczego? "k" ma się inkrementować tylko jeżeli sprawdzane znaki są identyczne. Zwrócenie true ma być tylko wtedy gdy k==srodek, a przy takim słowie jak to powyżej, k nie będzie równe srodek. W takim razie dlaczego wynik będzie true? Mimo tego, że już przy drugim sprawdzeniu: slowo[poczatek]==slowo[koniec-1] funkcja ma zwrócić false i już się nie wywoływać?

0
 
      while(pocz<kon)
            if(t[pocz++] != t[kon++])
                  return 0;
      return 1;
0

I jak ja mam to wykorzystać?
Rekurencyjnie to to nie wygląda, a zapisanie algorytmu, który nie jest odpowiedzą na moje pytanie, jest mało pomocne ; /

0
bool palindrom(const string &slowo, int poczatek, int koniec)
  {
   if(poczatek>=koniec) return true;
   if(slowo[poczatek++]!=slowo[--koniec]) return false;
   return palindrom(slowo,poczatek,koniec); 
  }
0

a czemu zamiast k<srodek nie dać pocz<srodek? po co k?
przecie k zawsze równe jest pocz.
trzeba się zastanowić co ze słowami o parzystej długości, a co o nieparzystej.

moja propozycja byłe nierekurencyjna, czy tak nie prościej?

int palindrom(string t, int pocz, int kon){
        while(pocz<kon)
                if(t[pocz++]!=t[kon--])
                        return 0;
        return 1;
}
                ....
                if(palindrom(slowo,0,slowo.length()-1)) cout << " palindrom\n";
                else cout << " nie\n";
0

Nie rekurencyjnie to trzeba tak:

bool palindrom(const string &s)
   {
    int p=0,k=s.length()-1;
    while((p<k)&&(s[p]!=s[k])) { ++p; --k; }
    return (p<k);
  }

if(palindrom(slowo)) cout<<"palindrom"<<endl;
else cout<<"nie"<<endl;

lub:

bool palindrom(const string &s)
   {
    const char *p=s.c_str(),k=p+s.length()-1;
    while((p<k)&&(*p!=*k)) { ++p; --k; }
    return (p<k);
  }

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.