Avatar billede backupmand Nybegynder
12. marts 2002 - 22:32 Der er 14 kommentarer og
1 løsning

problem med rekursiv palindrom funktion

Jeg har en rekursiv palindrom_funktion,
der modtager to arrays - det orignale,
et til at lægge en kopi i, længden
på array og en hjælper-int som jeg skal bruge..

det ser sådan ud:


void palindrom_recursive(char arr[],char rev[], int sz, int hlp)
{
            if (sz>1) // base case               
                palindrom_recursive(arr,rev,sz-1,hlp+1);       
            if (rev[sz]==' ')
                    {rev[hlp]=arr[sz];
                    count++;}
                    rev[hlp]=arr[sz-1];}
                       
Den gør hvad den skal - vender strengen om og kopierer
den over i rev. Men det er ikke altid et palindrom -
hvad hvis der er spaces i ordene ... det er dette
der er mit problem - hvordan tager jeg højde for det.
Jeg prøver alt muligt, eks. checker for spaces, laver
en tæller, der skal korte rev-arrayet ned med det
antal spaces der er, så det bliver en streng . .. eller
kan man bruge en tokenizer? Nogle bud. Har jeg forklaret mig godt nok ? Jeg vil gerne sammenligne den omvendte, sammentrukne (uden spaces) streng med det
originale array, hvorfor jeg vil bestemme om det er et palindrom.

Tak

               
Avatar billede disky Nybegynder
12. marts 2002 - 22:36 #1
kan du ikke strippe input for alle spaces først, eller kun køre indtil du møder første space.

Eller vende strengen hårdt om og sammenligne, så fanger den jo hvis det ikke passer

f.eks:

hej med dig -> gid dem jeh
sammenligner man dem er de ikke ens, altså ikke en palindrom sætning.
Avatar billede backupmand Nybegynder
12. marts 2002 - 23:33 #2
Hvis jeg kører indtil jeg møder første space får jeg ikke
resten af strengen med. Eller hvad mener du her?
jeg ved der er en metode til at vende en streng om, hvis det er det
du mener, men jeg kan ligeså godt : få funktionen til at gøre det hele og
det er også det jeg gerne vil.

Husk at selvom der er spaces kan det god være et palindrom
Hvad med
du er freud -> duerf re ud
dette er et palindrom og derfor ville jeg gerne, vha funktionen,
vende strengen om (så er det gjort), dernæst trimme for spaces -> for
så kan man nemlig se om det er et palindrom en gang for alle og det uden
at den der benytter funktionen behøver at vide det. Hvordan kringler jeg lige den?
Avatar billede jpk Nybegynder
13. marts 2002 - 08:35 #3
Lyder som den rigtige fremgangsmetode, men hvorfor gøre det besværligt og langsomt ved at implementere det som en rekursiv funktion?
Avatar billede backupmand Nybegynder
13. marts 2002 - 12:43 #4
Det har du ret i,
det er øvelsen i det, ikke andet.
Avatar billede laffe Nybegynder
20. marts 2002 - 21:48 #5
Kan dette bruges:
Jeg har testet det med: du er freud -> duerf re ud

void Palidrom(char* src, char* dst)
{
  char *p;
  char Buffer[512];
  memset(Buffer,0,sizeof(Buffer));
  int len = strlen(src);
  p = src + len - 1;
  for (int i=0; i<len; i++)
  {
    Buffer[i] = *p--;
  }
  StrCopy(dst,Buffer);
}

Det er godt nok ikke rekursiv ;-)
Avatar billede laffe Nybegynder
20. marts 2002 - 22:34 #6
Ovenstående gør det samme som din oprindlige funktion.

Følgende funktion sørger for at evt. spaces følger med i resultatet:

void Palidrom(char* src, char* dst)
{
  char *p;
  char *pspace;
  char Buffer[512];
  memset(Buffer,0,sizeof(Buffer));
  int len = strlen(src);
  p = src + len - 1;
  pspace = src;
  int idx=0;
  for (int i=0; i<len; i++)
  {
    if (*pspace == ' ')
    {
      Buffer[idx++] = ' ';
      len++;
    }
    else
    {
      if (*p != ' ')
      {
        Buffer[idx++] = *p--;
      }
      else
        p--;
    }
    pspace++;
  }
  StrCopy(dst,Buffer);
}
Avatar billede backupmand Nybegynder
20. marts 2002 - 22:35 #7
Åh ja ... memset kender jegh ikke men det ser ud som om
dener det mest skudsikre palindrom rutine. Den skal kunne tage
0 bogstaver = et palindrom 1 bogstav=palindrom
hvis en sætnings første og sidste bogstav er de samme og detmellem
liggende ord er et palindrom inkl. sætnings-palindrom. Lad mig lige
teste den af, forstå den...
imidlertid må du gerne lige forklare hvad du gør, så skal du nok få point.
Avatar billede laffe Nybegynder
21. marts 2002 - 19:30 #8
Her er en beskrivelse af, hvad routinen gør.

Buffer er en midlertidig buffer til den konverterede tekst.
Idx bruges til at indexere i Buffer.
Len er længden af src
p peger på den sidste character i src.
pspace peger på den første character i src.
pspace bruger jeg til at få den korrekte 'space' position over i dst.

Memset funktionen bruger jeg til a nul-stille min buffer til 0.

Jeg kører nu løkken igennem.

For hver gennemgang af løkken, så tæller er jeg pspace OP for at pege på den næste
character, og p NED, for at pege på den næste character.

Hvis pspace peger på et mellemrum i den oprindlige tekst (src), så sørger jeg for at
indsætte et mellemrum i nye tekst (Buffer).

Hvis pspace ikke peger på et mellemrum, så kopierer jeg det tegn som p peger på
over i Buffer, men kun hvis det IKKE er et mellemrum. Hvis det er et mellemrum,
så springer jeg det over.

Efter løkken kopierer jeg så Buffer over i dst.


Jeg er spændt på hvad du siger  :-)
Avatar billede backupmand Nybegynder
22. marts 2002 - 13:49 #9
Ifølge min Borland compiler kunne den ikke finde StrCopy... jeg kunne
bruge strcpy(); er det C?

Ok, ligemeget med det...
funktionen Palidrom : du tager altså src og hver gang der er et space,
så lægger du et space ind i Buffer? er det rigtigt?

Hvis jeg så skal kunne sige if (den ene streng==den anden streng)
hvilke to char arrays/pointere til chars skal jeg så bruge?

Når du siger pspace++ så tæller du pointeren en frem, ikke? dvs du
sætter pspace til at pege på den efterfølgende adresse.. ?

jeg har testet funktionen således:

int main()
{
char *src="du er freud";
char *dst="";
palindrome p_; // har sat funktionen ind i en klasse der hedder palindrome
p_.palindrom(src,dst);
cout << " src : " << src << endl;
cout << " dst : " << dst << endl;
return 0;
}

output bliver sjovt nok:( jeg bruger Borland compiler 5.2)
u er freuddu er freududd er freud

det ser ud som om den ikke tager højde for terminating "\0"?

..Så skal du bare gøre funktionen rekursiv, hehe!!!
Avatar billede laffe Nybegynder
22. marts 2002 - 13:59 #10
Jeg kompilerer med CBuilder6

strcpy er god nok.

funktionen Palidrom : du tager altså src og hver gang der er et space,
så lægger du et space ind i Buffer? er det rigtigt? 
-> JA

Når du siger pspace++ så tæller du pointeren en frem, ikke? dvs du
sætter pspace til at pege på den efterfølgende adresse.. ?
->JA/NEJ pspace kommer til at pege på den næste character.


Du skal allokere en buffer til dst altså char dst[32];

int main()
{
char *src="du er freud";
char dst[32];
palindrome p_; // har sat funktionen ind i en klasse der hedder palindrome
p_.palindrom(src,&dst);
cout << " src : " << src << endl;
cout << " dst : " << dst << endl;
return 0;
}

Bruger du memset funktionen ? hvis ikke, så skal "Buffer" i funktionen nulstilles.
Avatar billede laffe Nybegynder
22. marts 2002 - 14:11 #11
memset ligger i mem.h
Avatar billede backupmand Nybegynder
24. marts 2002 - 13:52 #12
jeg skal nok vende tilbage hurtigt, men jeg har lige et par ting jeg
skal se til ... sådan er det en gang imellem.
Avatar billede laffe Nybegynder
01. april 2002 - 22:29 #13
Hej backupmand.

Har du kigget på det ?
Avatar billede backupmand Nybegynder
02. april 2002 - 19:52 #14
ikke så meget, men jeg giver dig nogle points. Det
er satans når der er så meget andet herligt man skal
lave.
Avatar billede laffe Nybegynder
02. april 2002 - 19:53 #15
Tak for det, men jeg håber du vender tilbage når du har tid.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester