Algoritme: Rekursionet ne java

Pershendetje vizitor te albanianwizard. Shpresoj te keni kaluar nje kohe fitimprurese ne kete blog ashtu sic ka ndodhur tek mua…sot e tutje do mundohem dhe un te jap kontributin tim :).
Ne kete informacion te pare qe postoj ne Albanian Wizard do te trajtoj dhe shpjegoj nje algoritem i rendesishem dhe teper i perdorshem ne shkencat kompjuterike.
Pikerisht rekursionet.
Rekursioni eshte nje algoritem i cili zgjidh probleme dhe ceshtje nen ndihmen e nenceshtjeve…ja te jap nje shembull konkret dhe tipik te nje rekursioni:
Sic e dim 3! (faktoriali) = 3 * 2 * 1 (apo jo? )
Atehere kete faktorial mund ta paraqesim 3! = 3 * 2!
Ky eshte nje shembull tipik i nje rekursioni eshte “Hello World-i” i rekursioneve ­čśÇ .
Kalojm pak ne java dhe kete shembul, pra faktorialin e numrit n e paraqesim me ane te nje aplikacioni java:

import java.util.Scanner;
public class Faktorial
{
public static void main( String args[] )
{
Scanner input = new Scanner(System.in);
System.out.println(“Fusni nje nr ne menyre qe te paraqitet faktoriali tij”);
int nr = input.nextInt();
System.out.printf(“\n%d”,faktoriali(nr));

}
public static long faktoriali (int nr1 )
{
if ( nr1 <= 1 )
return nr1;
else
return nr1 * faktoriali( nr1 – 1 );
}
}

Pjesa qe na intereson eshte tek metoda faktoriali, e cila merr si argument nje integer nr1 (inseruar nga useri) dhe nqs ky nr eshte me i vogel apo i barabarte me 1 atehere kthehet vlera nr1, perndryshme nqs eshte me e madhe atehere numri i futur shumezohet me faktorialin e ketij nr – 1. pra pikerisht ajo qe shpjeguam me larte.
Ky eshte nje shembull i nje algoritmi rekursive. Nje problem te till mund ta zgjidhim edhe me ane te perseritjeve…per cfare na duhet rekursionet atehere??
Ka shum raste ne te cilat eshte me e lehte te perdorim rekursione se sa perseritje (for, while). Psh. nqs na duhet nje program i cili gjeneron te gjitha mundesite e kombinimeve te shkronjave ne nje String atehere eshte me mire te perdorim rekursionet…Per te gjetur kombinimet e n objekteve duhet te gjejme kombinimet e n – 1 objekteve dhe elementin e mbetur ta fusim ne te gjitha pozicionet e mundshme tek nje kombinim n-1.
Pra, nqs kemi tre objekte A, B, C dhe na duhet te gjejme te gjitha kombinimet e mundshme te dy objekteve B dhe C, te cila jane B C dhe C B. Me pas objektin e mbetur duhet ta inserojme ne cdo pozicion:
~ B ~ C ~    dhe ~ C ~ B ~  .

Konceptin e rekursionit mendoj se do ta kuptoni ne menyre me te zgjeruar edhe duke par source kodet ne java qe do te upload-oj se shpejti ne faqe ;).
Gjithsesi rekursioni ka shum per te folur e duhet praktikuar shum nqs doni te lexoni qarte nje source kod ku perdoret rekursion dhe eshte akoma me e veshtire per te shkruajtur nje te till.

Si nje trajtim i nivelit te par shpresoj tju kete pelqyer…

Introduksion ne java

Java 1

Ne kete teme do te trajtohet nje teme jo dhe aq introduktive ne java programming.
Po sqarojm shkurtimisht se si funksionon kjo gjuhe, kompilimin, java virtual machine etj.
Atehere, java eshte nje revolucion i vertet ne gjuhet e programimit si per karakterin e saj “object oriented” pra programimin e orjentuar ndaj objekteve por ne pergjithesi ve├žantia e java eshte se solli┬áportabilitetin ne programim.
Si├ž e dime, ne pergjithesi kemi 2 ndarje ose 2 kategori gjuhesh programimi..
“Gjuhet e kompiluara” – (gjuhe qe kodi i tyre kompilohet “perkthehet” ne kodin e makines dhe egzekutohet nga pro├žesori)
“Gjuhe te interpretuara” – (gjuhe qe nuk kane kompilues por interpretues i cili interpreton sintaksen dhe jep nje output te deshiruar)

Ne rastin e gjuheve te kompiluara ndodh ky pro├žes.
Psh ne shkruajm kete kod

if (columnNumber > 60) {
    wrapToNextLine();
}
else {
    continueSameLine();
}

Normalisht kodi me siper eshte totalisht abstrakt dhe i pakuptueshem per kompiuterin keshtu qe kompilatori e kthen ate kod ne kete

01101001 01100110 00100000 00101000 01100011 01101111 01101100 01110101 01101101 01101110 01001110 01110101 01101101 01100010 01100101 01110010 00100000 00111110 00100000 00110110 00110000 00101001 00100000 01111011 00001101 00001010 00100000 00100000 00100000 00100000 01110111 01110010 01100001 01110000 01010100 01101111 01001110 01100101 01111000 01110100 01001100 01101001 01101110 01100101 00101000 00101001 00111011 00001101 00001010 01111101 00001101 00001010 01100101 01101100 01110011 01100101 00100000 01111011 00001101 00001010 00100000 00100000 00100000 00100000 01100011 01101111 01101110 01110100 01101001 01101110 01110101 01100101 01010011 01100001 01101101 01100101 01001100 01101001 01101110 01100101 00101000 00101001 00111011 00001101 00001010 01111101 00001101 00001010

Kod i cili eshte i kuptueshem ng a kompiuteri, po a egzistojn realisht keto 00101001011 ?
Dikush mund te thote po, e hapa nje file  .class dhe pash ne te 0 dhe 1-sha.
Ne realitet kompiuteri nuk kupton as ato (├ža ti besh eshte ├žun i trash ) ┬áne realitet per kompiuterin nuk jane 0 dhe as 1 por impulse elektrike ku ato qe ne i quajm “1”-sh mund te perkthehen si “kalon rryme” ose “rryme me tension te lart” kurse ato qe ne i quajm “0” jane ” skalon rryme ” ose “rryme me tension te ulet”
Mbasi u qartesua edhe kjo mund te bejm disa pyetje rreth kompilatoreve.
Ok, po kompilatoret pse ndryshojn?
Pse ska vetem nje kompilator?
Pergjigja eshte sepse varet se ne ├ž’fare sistemi operativ jemi por me e rendesishmja eshte se kemi arkitektura te ndryshme kompiuterash dhe ne baze te arkitektures jane dhe kompiluesit apo kompilatoret.
Te flasim pak per JAVA dhe specifikat e saj.
Me siper thame se java solli portabilitetin e kodit, ├ž’fare eshte portabiliteti dhe ne ├ž’kuptim e solli?
Kur folem me siper per kompilatoret e morem vesh se nje program i kompiluar ne nje kompiuter me arkitekture MIPS xD nuk eshte i njejt me nje kod te kompiluar ne nje kompiuter me arkitekture x86_64 dhe kjo eshte me se evidente.
Keshtu qe java mendoj te thyente keto limite ­čśë
Dhe shpiku JVM (java virtual machine) e cila eshte “interpretuesi i javas”
Nje pyetje natyrale do te ishte, po si atehere java nuk eshte gjuhe e kompiluar?
Jo Java eshte gjuhe e kompiluar por eshte ajo pjeseza qe perfeksionoi gjendjen.
Dhe me kete lindi shprehja : “nje .class file mbetet nje .class file” ose “populli popull mbetet :p” :)
Kur ne shkruajm nje program ne java, krijojm nje file .java
Shembull, po shkruajm hello worldin e famshem ne menyren time.

public class Yeah { /*kjo eshte klass publike dhe emertohet me Yeah (ta dish: emri i klases percakton edhe emrin e failit)
dhe ne kete rast do te formohet nje fail Yeah.java dhe Yeah.class*/
  public static void main ( String args []) //tipike ne java :p kujdes, main eshte metod
  {
	  System.out.print ("Yeah, po programoj ne java"); //Metod per printimin e tekstit ne ekran
  }
}

Ok, ja ku e shkruajtem edhe kodin tone, po me?
Tani do krijohet nje file.java dhe nje tjeter qe do te jet kod binar i quajtur Yeah.class
Kur ndodh pro├žesi i kompilimit dhe kur ai i interpretimit?

Pro├žesi i kompilimit apo i “perkthimit te kodit” ndodh kur kody yn java i shkruajtur bukur bukur dhe i kuptueshem nga ne merr pamje makaber :p (pra kodi qe gjendet ne nje class file eshte binar [010010001…])
Dhe ne kete rast shkronjat u perkthyen dhe u kthyen ne impulse elektrike (jemi akoma ne leter)
Pro├žesi i interpretimit ndodh atehere kur JVM e merr kete kod .class dhe e interpreton ate per ne baze te arkitektures se kompiuterit tone dhe sistemit operativ.

Per ta verifikuar kete mund te merrni nje .class fille te kompiluar ne nje ambjent operativ linux dhe ta ├žoni ne nje ambjent windows dhe te shikoni a do te punoj :)
Pergjigja eshte PO dhe kjo ne fale te JVM