Rekurzivne funkcije

poruka: 22
|
čitano: 4.633
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
15 godina
neaktivan
offline
Rekurzivne funkcije

Da li mi netko moze odgovoriti zasto program za invertiranje stringe vraca umjesto stringe  brojeve i znakove? koje su najcesce greske? Unaprijed hvala na odgovorima!

Poruka je uređivana zadnji put ned 13.11.2011 18:17 (prvasica).
 
0 0 hvala 0
17 godina
neaktivan
offline
Rekurzivne funkcije

Zvuči kao da ispisuješ neinicijalizirane varijable ili pointere umjesto vrijednosti, ali može biti svašta, teško je reći bez koda...

 

Moj PC  
0 0 hvala 0
13 godina
neaktivan
offline
Re: Rekurzivne funkcije

Daj kod, pa ćemo onda vidjeti kuda i kako!

Programming is understanding. – Kristen Nygaard
15 godina
neaktivan
offline
Re: Rekurzivne funkcije

evo koda! nije c, ali sve je to vise-manje isto.

 

 

 

function cambio (Parola : String; I: integer) return string is
      Riverso : String (Parola'Range);
   begin
      if (I>Parola'Last) then
    return Riverso;
    else
         Riverso (Riverso'Last - I + Parola'First) := Parola (I);
     
    return Cambio (Parola,I+1);
     
      end if;
   end cambio;

15 godina
neaktivan
offline
Rekurzivne funkcije

ovo je cijeli kod..

 

 

with Ada.Text_IO;
use Ada.Text_IO;
with  Ada.Integer_Text_IO;
use Ada.Integer_Text_IO;
 
 
 
  procedure Ritroso5 is
     X: String(1..50);
     Lung:Integer;
   function cambio (Parola : String; I: integer) return string is
      Riverso : String (Parola'Range);
   begin
      if (I>Parola'Last) then
    return Riverso;
    else
         Riverso (Riverso'Last - I + Parola'First) := Parola (I);
     
    return Cambio (Parola,I+1);
     
      end if;
   end cambio;
begin
  
   Put_Line ("Inserisci una stringa!");
   Get_LIne(X,lung);
   Put_Line (cambio (X(1..Lung),1));
 
end Ritroso5;

 
0 0 hvala 0
13 godina
neaktivan
offline
Re: Rekurzivne funkcije

Pascal?, neznam Pascal, da je C-like ili Basic pomogao bi ti, a ovako..., to ti zna @mbaksa, on je dobar sa Pascalom.

Programming is understanding. – Kristen Nygaard
Poruka je uređivana zadnji put ned 13.11.2011 19:18 (royalhero).
15 godina
neaktivan
offline
Rekurzivne funkcije

Nije Pascal,. to je Ada.. ajme cijeli dan to pokusavam rijesiti. Kad rjesavam bez rekurzije, funkcionira. ne mogu uopce skuziti u cemu je problem.. :-(

 
0 0 hvala 0
13 godina
neaktivan
offline
Re: Rekurzivne funkcije

Da li moraš to raditi u Adi ili svojevoljno radiš u Adi.

Programming is understanding. – Kristen Nygaard
15 godina
neaktivan
offline
Re: Rekurzivne funkcije

a moram bas u adi i bez koristenja pokazivaca.. i mora biti rekurzivno..

13 godina
neaktivan
offline
Re: Rekurzivne funkcije

A neznam nikoga da zna Adu, a da ima profil na ovom forumu, možda se varam?

Programming is understanding. – Kristen Nygaard
15 godina
neaktivan
offline
Re: Rekurzivne funkcije

Da, ali nije bitno u cemu programiras, logika je ista..

13 godina
neaktivan
offline
Re: Rekurzivne funkcije
prvasica kaže...

Da, ali nije bitno u cemu programiras, logika je ista..

Da, ali je teško u neprepoznatljivom kodu vidjeti logiku programa.

Programming is understanding. – Kristen Nygaard
16 godina
neaktivan
offline
Re: Rekurzivne funkcije
prvasica kaže...

ovo je cijeli kod..

 

...

   Put_Line ("Inserisci una stringa!");
   Get_LIne(X,lung);
   Put_Line (cambio (X(1..Lung),1));
 
end Ritroso5;

Probaj staviti malo "i" unutar Get_Line ?

All religions are the same: religion is basically guilt, with different holidays.
17 godina
offline
Rekurzivne funkcije

Ako nije bitan jezik, nego logika programiranja, možda ovo pomogne

(BTW. ne znam Adu, talijanski još i manje)

 

 

#include<iostream>
#include<string>
using namespace std;

void RekurzijaObrnutaRijec(string rijec, string& obrnutaRijec, int duljinaStringa)
{
    if (duljinaStringa == 0) return; // kad ova varijabla postane 0 - rekurzija se prekida
    obrnutaRijec += rijec[duljinaStringa - 1];  // novi string nadovezujemo sa indexsom trenutne duljine starog stringa
    RekurzijaObrnutaRijec(rijec, obrnutaRijec, duljinaStringa -= 1); // funkcija se poziva rekurzivno i svakim pozivom
}                                                                    // se smanjuje varijabla duljinaStringa  
 
int main()
{
    string rijec = "prvasica uci Adu";
    string obrnutaRijec = "";
    RekurzijaObrnutaRijec(rijec, obrnutaRijec, rijec.length());
    cout << obrnutaRijec << endl;
}

Poruka je uređivana zadnji put pon 14.11.2011 14:26 (Floki).
 
0 0 hvala 0
17 godina
offline
Rekurzivne funkcije

Ovaj algoritam ispunjava uvjete zadatka, radi rekurzivno, nema pokazivača ni referenci, a barata sa samo jednim char nizom.

(ako se može preslikati u Adu, trebao bi raditi - nije toliko bitna sintaksa - koliko algoritam - pa bi se trebalo moći preslikati u Adu)

Praktički, umjesto iteracija petlje pozivamo funkciju i vršimo zamjenu komparativnih pozicija niza po istom obrascu kao u iteraciji.

 

#include<iostream>
#include<string>
using namespace std;

void RekurzijaObrnutaRijec(char rijec[], int duljinaStringa, int pozicija)
{
    if (duljinaStringa < 2) return; // nemamo što raditi
    char pom;
    pom = rijec[pozicija];
    rijec[pozicija] = rijec[duljinaStringa - pozicija -1];   // mjenjamo pozicije u char nizu da dobijemo obrnuti niz
    rijec[duljinaStringa - pozicija - 1] = pom;
    if (duljinaStringa/2 == pozicija+1) return;  // bitan je ovaj uvjet  za prekid rekurzije, kad se ispuni - rekurzija staje
    RekurzijaObrnutaRijec(rijec,  duljinaStringa, pozicija += 1); // funkcija se poziva rekurzivno i svakim pozivom
                                                                // povećava se vrijednost pozicije
}


 
int main()
{
    char rijec[] = "Prvasica uci Adu";
    int pozicija = 0, duljinaStringa = 0;
    for(int i = 0; rijec[i] != '\0'; i++)
    {
       duljinaStringa++;
    }
    RekurzijaObrnutaRijec(rijec, duljinaStringa, pozicija);
    cout<< rijec << endl;
   
}

Poruka je uređivana zadnji put pon 14.11.2011 20:39 (Floki).
 
0 0 hvala 0
17 godina
offline
Rekurzivne funkcije

Last, but not least

Evo primjera punokrvne rekurzije koja vraćanjem na stogu radi konkatenaciju stringa da bi se dobio obrnuti redosljed:

(sistem ogledala - na vrhu stoga počinje se od praznog stringa i spuštanjem dolje se vrši nadovezivanje , po sistemu slovoNaTrenutnomStogu + dotadašnjiZbirSlovaSaPrijeđenihStogova)

 

 

#include<iostream>
#include<string>
using namespace std;

string RekurzijaObrnutaRijec(string rijec, int duljinaStringa)
{
    if (duljinaStringa == 0) return ""; // kad se rekurzija prekine, vraćanje na stogovima polazi od praznog stoga
    return rijec[duljinaStringa ] +  RekurzijaObrnutaRijec(rijec, duljinaStringa -= 1);
} // na stogu se ostavljaju slova u obrnutom redosljedu, kad rekurzija vraća ide konkatenacija po
  // sistemu slovo na stogu + dotadašnja riječ
int main()
{
    string rijec = "Prvasica uci Adu";   
    string obrnuto = RekurzijaObrnutaRijec(rijec, rijec.length());
    cout<< obrnuto << endl;
    return 0;
}

Poruka je uređivana zadnji put uto 15.11.2011 14:56 (Floki).
 
0 0 hvala 0
16 godina
neaktivan
offline
Rekurzivne funkcije

@Floki,

pa ako si se vec toliko "napalio" na rekurziju sta ne napravis neki primjer pisan u Ada-i {#}

All religions are the same: religion is basically guilt, with different holidays.
 
0 0 hvala 0
17 godina
offline
Re: Rekurzivne funkcije
drnde kaže...

@Floki,

pa ako si se vec toliko "napalio" na rekurziju sta ne napravis neki primjer pisan u Ada-i {#}

Ne znam tu Adu{#}

što bi rekurzija u njoj trebala ići drukčije?

Poruka je uređivana zadnji put uto 15.11.2011 15:43 (Floki).
16 godina
neaktivan
offline
Re: Rekurzivne funkcije
Floki kaže...
drnde kaže...

@Floki,

pa ako si se vec toliko "napalio" na rekurziju sta ne napravis neki primjer pisan u Ada-i {#}

Ne znam tu Adu{#}

Pa bas to i mislim reci, uzmi si 20 min da smislis kako napraviti star u Ada-i,

logika je potpuno ista, ovako bar nesto novo naucis.

All religions are the same: religion is basically guilt, with different holidays.
17 godina
offline
Rekurzivne funkcije

Koliko se sjećam, ona barata sa C++, a brzo i kuži

pretvorit će ona alogoritam iz C++ u Ada-u, pogotovo onaj zadnji

nema potrebe da ja brljam po nečem u čem nisam radio

a pravo da ti kažem, ne volim taj kod koji me podsjeća na basic-ovski

 

btw. a mislim da njoj nije problem sintaksa Ada-e, nego algoritam koji rekurzivno invertira niz

Poruka je uređivana zadnji put uto 15.11.2011 16:05 (Floki).
 
0 0 hvala 0
16 godina
neaktivan
offline
Re: Rekurzivne funkcije
Floki kaže...

Koliko se sjećam, ona barata sa C++, a brzo i kuži

pretvorit će ona alogoritam iz C++ u Ada-u, pogotovo onaj zadnji

nema potrebe da ja brljam po nečem u čem nisam radio

Ma eto mislio sam da ce te mozda zanimati probati nesto novo pa sam

predlozio... nevermind 

All religions are the same: religion is basically guilt, with different holidays.
14 godina
neaktivan
offline
Re: Rekurzivne funkcije

Kakva ti je točno greška? Na prvi pogled, rekurzija mi se čini ok iako je više riječ o zakamufliranoj petlji nego pravoj rekurziji.

 

Sumnjiva mi je ova naredba: Put_Line (cambio (X(1..Lung),1)); Da X(1..Lung) možda ne stvara novi, nasumično inicijalizirani string? Ja bi napisao ovako:   Put_Line (cambio (X,1)); Ako je to pak način za izvlačenje podstringa, onda problem leži negdje drugdje. Također, u   programu koji si navela ne vidim da se igdje poziva ona procedura.

Poruka je uređivana zadnji put sri 16.11.2011 0:06 (Max Demian).
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice