Pereiti prie turinio

Rekomenduojami pranešimai

Supaprastina nes nereikia naudoti ciklų (fow, while, ...). Tai ciklo atmaina.

Jos nauda tokia pati kaip ir įprastinių ciklų, tik aprašoma kitaip, paprasčiau.

Funkcija kreipiasi pati į save perduodama kokį nors argumentą.

Būtina apibrėžti sąlygas, kad nebūtų amžinojo ciklo.

 

Rekursija galima visose programavimo kalbose. Čia mano rekursijos pavyzdys C# konsolėje

using System;

namespace Rekursija
{
class Program
{
   	static void Main(string[] args)
   	{
       	Console.WriteLine("Įveskite ieškomą faktorialą: ");

       	int fakt = Convert.ToInt32(Console.ReadLine());
       	int atsakymas = Faktorialas(fakt);

       	Console.WriteLine(atsakymas);

       	Console.Write("Spauskite bet kurį klavišą, kad išeitumėte. ");
       	Console.ReadKey();
   	}
   	static int Faktorialas(int skaicius)
   	{
       	if (skaicius == 1) { return skaicius; }
       	else
       	{
           	return Faktorialas(skaicius - 1) * skaicius;
       	}
   	}
}
}

 

Tą patį galima ir su ciklu padaryt:

static int Faktorialas(int skaicius)
   	{
       	int f = 1;
       	for (int i = skaicius; i > 0; i--)
       	{
           	f *= i;
       	}
       	return f;
   	}

 

Renkiesi kas patogiau kiekvienoj situacijoje.

Redagavo Winix
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Supaprastina nes nereikia naudoti ciklų (fow, while, ...). Tai ciklo atmaina.

Jos nauda tokia pati kaip ir įprastinių ciklų, tik aprašoma kitaip, paprasčiau.

Funkcija kreipiasi pati į save perduodama kokį nors argumentą.

Būtina apibrėžti sąlygas, kad nebūtų amžinojo ciklo.

 

Rekursija galima visose programavimo kalbose. Čia mano rekursijos pavyzdys C# konsolėje

using System;

namespace Rekursija
{
class Program
{
   	static void Main(string[] args)
   	{
       	Console.WriteLine("Įveskite ieškomą faktorialą: ");

       	int fakt = Convert.ToInt32(Console.ReadLine());
       	int atsakymas = Faktorialas(fakt);

       	Console.WriteLine(atsakymas);

       	Console.Write("Spauskite bet kurį klavišą, kad išeitumėte. ");
       	Console.ReadKey();
   	}
   	static int Faktorialas(int skaicius)
   	{
       	if (skaicius == 1) { return skaicius; }
       	else
       	{
           	return Faktorialas(skaicius - 1) * skaicius;
       	}
   	}
}
}

 

Tą patį galima ir su ciklu padaryt:

static int Faktorialas(int skaicius)
   	{
       	int f = 1;
       	for (int i = skaicius; i > 0; i--)
       	{
           	f *= i;
       	}
       	return f;
   	}

 

Renkiesi kas patogiau kiekvienoj situacijoje.

 

Ech, ciklai man suprantamiau, tačiau laboratoriniam darbe rekursija yra butina sąlyga :D Galbūt pavyks perprasti, dėkui!

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tai žiūrint ką tau reikia padaryti, gal nėra tokio sudėtingo ir panaudosi ta rekursiją

 

 

Yra duotas startas ir finišas. Poto duoti maršrutai ir atstumas tarp jų. Man reikia rasti trumpiausią atstumą tarp starto ir finišo. Pvz: gali būti, kad prie maršrutų bus duota starto ir finiso atstumas, tačiau einant per kitus maršrutus (tarpiniai miestai) yra trumpesnis kelias. Tai nelabai įsivaizduoju, kaip tą rekursiją panaudot

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Rekursija turi vieną trūkumą - kviečiant funkciją naudojamas stack'as tad einant labai giliai gausi stackoverflow exception'ą, begalinio ciklo su ja neužsuksi. Tačiau naudojant protingai tikrai gali su paprastinti kodą. Taip pat su rekursija paprasta backtrack'inti. Pavyzdžiui apeinant grafą nuėjus kažkuria šaka reikia grįžti - kiek reikia išlendam (return'inam) iš rekursijos ir imam kitą šaką ir viskas. Nereikia rūpintis kintamųjų reikšmių atstatymu. Su rekursija reikia "persilaužti", parsisiųsk kokią pavyzdinę funkciją, passitep'ink kodą ir pasidarys aišku kam ji naudojama. ;)

 

Kiekvienas ciklas dažniausiai sukompiliuojamas į rekursiją. Rekursija jei gerai parašyta veikia efektyviau (ypač žemesnio lygio kalbose), tačiau valgo daugiau atminties, dėl ko didelėse rekursijose galimi exceptions. Pvz stack overflow :)

Kažką maišai, turbūt dažniau vyksta atvirkščias procesas t.y rekursija verčia į ciklą. Versti į rekursiją nėra prasmės vien dėl to kas vyksta su stack'u :)

http://stackoverflow.com/questions/2651112/is-recursion-ever-faster-than-looping

Redagavo Paulas
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...