2024(e)ko otsailaren 28(a), asteazkena

Algoritmoak

Algoritmo hitza, berez, IX. mendeko matematikari persiar baten izenetik eratortzen da: Al-Khwarizmi. Greziar tradizio matematikoak, nagusiki, geometriari buruz hitz egiten zuen, triangeluak, zirkuluak eta poligonoak bezalako formei buruz, eta azalera eta bolumena kalkulatzeko moduari buruz. Bestalde, Indiako matematikak kalkulua askoz sinpleagoa egiten zuen hamar sinboloko sistema hamartarrari esker. Al-Khwarizmiren ekarpena: Al-Khwarizmik greziar irudiak eta indiar sinboloak konbinatu zituen, gaur egun aljebra deitzen dugun pentsamendu matematikoari hasiera emanez.

XIX. mendean Ada Lovelace-k makina analitikoaren bidez Bernouilliren zenbakiak kalkulatzeko algoritmo bat idatzi zuen: zer eragiketa egin behar ziren, zer ordenan, zer aldagairen gainean, begiztak, baldintzen menpeko jauziak... Hori guztia ordenagailu baterako programa gisa har daiteke. Horregatik, historiako lehen programatzailetzat hartu izan da Lovelace.


Abu Abdallah Muḥammad ibn Mūsā al-Jwārizmī (arabieraz: أبو عبد الله محمد بن موسى الخوارزمي ابو جعفر‎; c. 780 – c. 850), Al-Khwarizmi izenaz ezaguna. Al-Khwarizmi (Sobiet Batasuneko seilua, 1983)


Ada Lovelace, Augusta Ada Byron (Lovelaceko kondesa). Historiako lehen programatzailea izan zela esan ohi da, eta Charles Babbageren konputagailu mekanikoaren gaitasuna erakutsi zuen


Ada Lovelace eredutzat har daitekeen bezala, historian izan dira beste emakume zientzialari asko. Hona hemen, mosaiko txiki bat:

Guzti horien artetik pare bat aipatzearren, ondoko bi hauek nabarmenduko
genituzke: Hedy Lamarr ingeniaria eta Sofia Kovalevskaia matematikaria

Jarraian ondoko hauek ikusiko ditugu:

  • Algoritmoaren kontzeptua
  • Ezagutzen ditugun algoritmo batzuk
  • Algoritmoen adierazpenak
  • Algoritmo baten adibidea


Problema informatiko bati erantzuna emateko lau urrtas hauek bete behar dira:
  1. Arazoaren definizioa
  2. Algoritmoa asmatu
  3. Algoritmoa programa bezala idatzi
  4. Soluzioa ebaluatu
Beraz programa bat idatzi aurretik algoritmo bat asmatu beharra daukagu. Baina algoritmoa zer da? Intuitibori erraz definitzen da: lan bat exekutatzeko behar diren instrukzioen multzoa da algoritmoa.

Algoritmo kontzeptuaren definizioa: Problema baten ebazpena lortzen duen pauso-sekuentzia finitu, ordenatu eta anbiguotasun gabekoa [Knuth, 1968]. Edozein programak algoritmo bat dauka bere baitan, algoritmoak independenteak dira programa idaztean erabilitako programazio-lengoaiarekiko zein programa exekutatzen duen ordenagailuarekiko.

Algoritmoen ezaugarriak:
  • Zehatza da (zalantzagarritasunik gabea)
  • Pausoen kopurua finitua da
  • Pausoen arteko ordena adierazi behar du
  • Bukatu egin behar du
  • Bi aldiz exekutatzean emaitza bera bueltatu behar du
  • Programazio-lengoaiarekiko independentea da
  • Dagokion programa exekutatzen duen ordenagailuarekiko independentea da


Dagoeneko programatzen ari garelako, konturatu ez garen arren, algoritmoak erabiltzen ari gara. Ikusitako algoritmo batzuei begirada bat bota diezaiegun:

Laster ikusiko ditugu beste algoritmo bi hauek: 6. astea | zenbaki bat asmatzen eta 6. astea | letra bat asmatzen



Algoritmoak adierazteko funtsean bi modu daude:
  • Lengoaia-naturala: sasikodea
  • Modu grafikoa: fluxu-diagrama edo organigrama

Algoritmoen adibiderik klasikoenak errezetak dira, jarraian Pedro Subijana maisu famatuaren “Denok Sukaldari” liburutik hartutako algoritmoa ematen da:



Algoritmoak ideiak transmititzeko tresnak direnez grafikoak izan daitezke, jostailuak muntatzeko orrietan agertzen diren bezalakoak:



Algoritmoak adierazteko fluxu-diagramak erabiltzen dira, Esate baterako, Grezia zaharrean Euklides matematikariak gure egunetara iritsi den algoritmoa asmatu zuen bi zenbakien zatitzaile komunetako handiena z.k.h. lortzeko. Hauxe da Euklidesen algoritmoari dagokion fluxu-diagrama:







Adibide honetan zenbaki sorta baten maximoa zehaztuko dugu. Hemen algoritmoa:

  1. Zehaztu zenbat zenbakik osatuko duten zenbakien sorta
  2. Sortaren lehen zenbakia irakurri
  3. Lehen zenbaki hori maximoa da
  4. Errepikatu zenbakien sorta amaitu arte:
    • Zenbaki berria irakurri
    • Zenbaki berria maximoa baino handiagoa bada maximoaren balioa berritu
  5. Maximoa erakutsi

Eta hemen algoritmo hori Pascal programazio-lengoaian ezarrita:
program ZenbakiSortaBatenMaximoa ;

uses
   crt ;
var
   iZenbakiKopurua, iZbk, iMaximoa, iKont : integer ;

begin
   clrscr ;
   writeln('Zenbaki positibo osoen sorta batean sartutako maximoa zehaztu') ;
   writeln('=============================================================') ;
   writeln ;
   
   (* --------------------------ALGORITMOAREN 1. URRATSA------------------ *)
   repeat
      write('Zenbaki osoen kopuru eman: ') ;
      readln(iZenbakiKopurua) ;
   until iZenbakiKopurua > 0 ;  
   writeln ;
   
   (* --------------------------ALGORITMOAREN 2. URRATSA------------------ *)
   repeat
      write('Lehen zenbaki positiboa eman: ') ;
      readln(iZbk) ;
   until iZbk > 0 ;
   
   (* --------------------------ALGORITMOAREN 3. URRATSA------------------ *)
   { lehen zenbakia iMaximoa da }
   iMaximoa := iZbk ;
   
   (* --------------------------ALGORITMOAREN 4. URRATSA------------------ *)
   for iKont:=2 to iZenbakiKopurua do
   begin
      repeat
         write(iKont, '. zenbaki positiboa eman: ') ;
         readln(iZbk) ;
      until iZbk > 0 ;
      
      if iZbk > iMaximoa then     { oraintxe sartutakoa handiagoa denean }
      begin
         iMaximoa := iZbk ;
      end ;
   end ;
   
   (* --------------------------ALGORITMOAREN 5. URRATSA------------------ *)
   writeln ;
   writeln('Maximoa = ', iMaximoa) ;
   
   repeat until keypressed ;
end.

Hauxe da programa horren balizko irteera bat:


Ikusi algoritmo honen programazio desberdinak:

 

Errekurtsibitatea zertan den







Ez dugu ariketa errekurtsibo asko aurkituko gure programetan, baina interesgarria da kontzeptu hori lantzea azpiprogramak aktibatzen direnean zer gertatzen den ikasteko.

Egoera errekurtsiboak bizitzan eta naturan ematen dira eta jarraian adibide grafikoak erakusten dira:











iZenbaki zenbaki baten faktoriala kalkulatzen duen funtzio errekurtsiboa erakusten da jarraian. Faktorialaren kalkulu errekurtsiboa algoritmo honetan oinarritzen da:
iZenbaki! = iZenbaki * (iZenbaki - 1)!
program FaktorialErrekurtsiboaAzaltzen ;

function fnliFaktorialaKalkulatu(iZbk: integer) : longint  ;
begin
   if iZbk = 1 then
   begin
      WriteLn('1! badakit kalkulatzen, itzuli 1 modulu deitzaileari') ;
      fnliFaktorialaKalkulatu := 1 ;
   end
   else
   begin
      writeln(iZbk, '! kalkulatzeko ', iZbk-1, '! ezagutu behar dut') ;
      fnliFaktorialaKalkulatu := iZbk * fnliFaktorialaKalkulatu(iZbk - 1) ;
      writeln(iZbk, '! kalkulatu dut ', iZbk-1, '! * ', iZbk, ' eginez') ;
   end ;
end ;


var
  liEmaitza : longint ;
  iDatua : integer ;

begin
   repeat
      write('Eman zenbaki osoa: ') ;
      readln(iDatua) ;
   until iDatua > 0 ;
   liEmaitza := fnliFaktorialaKalkulatu(iDatua) ;
   writeln(iDatua, '! = ', liEmaitza) ;
   readln ;
end.


FaktorialErrekurtsiboa.pas programa hartu eta zuk zeuk exekutatu.



Fibonacciren segidaren adierazpen orokorra gogoratuz:

{\displaystyle F_{n}={\begin{cases}0&n=0{\mbox{ bada}}\\1&n=1{\mbox{ bada}}\\F_{n-1}+F_{n-2}&n>1{\mbox{ bada}}\\\end{cases}}}

Hauxe da fniFibonacci funtzio errekurtsiboa:
{-------------------------FUNTZIO ERREKURTSIBOA-------------------------}
function fniFibonacci(iZbk: integer): integer ;
begin
   if (iZbk = 0) or (iZbk = 1) then
      fniFibonacci := iZbk
   else
      fniFibonacci := fniFibonacci(iZbk-1) + fniFibonacci(iZbk-2) ;
end ; 
Teklatuaren bitartez iZenbat kopuru oso bat irakurri eta Fibonacci-ren lehen iZenbat zenbakiak pantailaratu. Hauxe da programa eta bere exekuzioaren irteera bat:
program FibonacciErrekurtsiboa ;
uses
   crt ;
const
   AZKENMUGA = 24 ;    { integer datu-motak ez du gehiago ematen }


{-------------------------FUNTZIO ERREKURTSIBOA-------------------------}
function fniFibonacci(iZbk: integer): integer ;
begin
   if (iZbk = 0) or (iZbk = 1) then
      fniFibonacci := iZbk
   else
      fniFibonacci := fniFibonacci(iZbk-1) + fniFibonacci(iZbk-2) ;
end ;


{---------------------------PROGRAMA NAGUSIA---------------------------}
var
   iZenbat, iKont: integer ;
   cErantzuna: char ;
begin
   writeln ;
   repeat
      repeat
         write('Eman Fibonacci segidaren zenbaki kopurua (1 eta ', AZKENMUGA,' artekoa): ') ;
         readln(iZenbat) ;
      until (iZenbat >= 1) and (iZenbat <= AZKENMUGA) ;

      writeln ;

      for iKont:=1 to iZenbat do
      begin
         if (iKont = 1) or (iKont = 2) then
            writeln(iKont:20, ' >>>>>> ', fniFibonacci(iKont-1))
         else
            writeln(iKont:20, ' -----> ', fniFibonacci(iKont-1)) ;
      end ;

      writeln ;

      write('Amaitu nahi duzu? (B/E): ') ;
      repeat
         cErantzuna := readkey ;
         writeln(cErantzuna) ;
         cErantzuna := upcase(cErantzuna) ;
      until (cErantzuna = 'B') or (cErantzuna = 'E') ;
      writeln ;
      writeln ;
   until cErantzuna = 'B' ;
   
   write('Programa bukatu da') ;
   
   repeat until keypressed ;
end. 


Goiko programa hobeto ulertzeko, aztertu ere FibonacciErrekurtsiboa_formatua.pas bertsioa non pantailan idazketa batzuk egiten diren, eta horiei esker programa exekutatzean ikus daiteke kodearen zein puntutan aurkitzen garen.


 

Azpiprogramak: Divide et Impera

AzpiprogramakDivide et Impera

Hasierako programa
program AzpiprogramenParametroak_01 ;
uses
   crt;

procedure Gehitu5Gehiago (Zenbaki1: integer; Zenbaki2: integer);
begin
   textcolor(Cyan);
   writeln('    Gehitu5Gehiago BARRUAN, batuketa egin baino LEHEN:  ',
                Zenbaki1:4, Zenbaki2:4);
   Zenbaki1 := Zenbaki1 + 5;
   Zenbaki2 := Zenbaki2 + 5;
   writeln('    Gehitu5Gehiago BARRUAN, batuketa egin ONDOREN:      ',
                Zenbaki1:4, Zenbaki2:4);
   textcolor(LightGray);
end;
  
{------------------------ Programa Nagusia ------------------------}
var
   iKopuru1, iKopuru2: integer;
begin
   iKopuru1 := 10;
   iKopuru2 := 20;
   writeln('PROGRAMA NAGUSIAN Gehitu5Gehiago deitu AURRETIK:        ',
            iKopuru1:4, iKopuru2:4);
   writeln;
    
   Gehitu5Gehiago(iKopuru1, iKopuru2);
    
   writeln;
   writeln('PROGRAMA NAGUSIAN Gehitu5Gehiago deitu ONDOREN:         ',
            iKopuru1:4, iKopuru2:4);
   writeln;
   readln;
end.  
  








Programa bat daukagu Gehitu5Gehiago izeneko prozedurari deia egiten diona, honako hauek ikusi:
  • Gehitu5Gehiago prozedurak bi parametro ditu, biak integer datu-motatakoak
  • Gehitu5Gehiago prozeduraren bi parametroak sarrerakoak dira
  • Gehitu5Gehiago prozedurari deia egiteko sententzia bezala idazten da
  • Gehitu5Gehiago prozedurari deia egitean uneko parametroak komaz banatzen dira
  • Gehitu5Gehiago prozeduraren parametro formalak puntu eta komaz banatzen dira
AzpiprogramenParametroak_01.pas programaren bitartez zer ikasi duzu?


Programa bat daukagu Gehitu5Gehiago prozeduraren parametroak sarrerakoak direla ikusi, honako frogak egin:
  • AzpiprogramenParametroak_02 programa exekutatu eta emaitza aztertu
  • AzpiprogramenParametroak_02 programaren emaitza aztertu aldaketa hauek eginez:
    • iKopuru1 uneko parametroaren balioa 100 izan dadila
    • iKopuru2 uneko parametroaren balioa 200 izan dadila
  • Gehitu5Gehiago prozedura barruko parametroen izenak aldatu:
    • Zenbaki1 parametro formala iKopuru1 izendatu
    • Zenbaki2 parametro formala iKopuru2 izendatu
  • Gehitu5Gehiago prozeduraren deian uneko parametroak elkar trukatu:
    • iKopuru1 uneko parametroaren posizioan iKopuru2 idatzi
    • iKopuru2 uneko parametroaren posizioan iKopuru1 idatzi
  • Gehitu5Gehiago prozeduraren deia aldatu adierazpen matematiko hauek jarriz:
    • Gehitu5Gehiago(iKopuru1 + 10, iKopuru2 + 20) ;
  • Gehitu5Gehiago prozeduraren deia aldatu konstante hauek jarriz:
    • Gehitu5Gehiago(11, 22) ;
AzpiprogramenParametroak_02.pas programaren bitartez zer ikasi duzu?


Gehitu5Gehiago prozeduraren parametroen datu-motak aldatu, honako frogak egin:
  • AzpiprogramenParametroak_03 programaren hasieran parametro guztiak integer dira:
    • iKopuru1 eta iKopuru2 aldagaiak integer bezala erazagutu dira
    • Zenbaki1 eta Zenbaki2 parametro formalak integer dira ere
  • Gehitu5Gehiago prozeduraren parametro formal baten datu-mota aldatu:
    • Zenbaki1 parametro formala integer bezala mantendu
    • Zenbaki2 parametro formala real datu-motara aldatu
    • iKopuru1 eta iKopuru2 uneko parametroak integer bezala mantendu
  • Gehitu5Gehiago prozeduraren deian uneko parametro baten datu-mota aldatu:
    • Zenbaki1 parametro formala integer bezala mantendu
    • Zenbaki2 parametro formala integer bezala berriro jarri
    • iKopuru1 uneko parametroa integer bezala mantendu
    • iKopuru2 uneko parametroari datu-mota aldatu real jarriz
AzpiprogramenParametroak_03.pas programaren bitartez zer ikasi duzu?


Gehitu5Gehiago prozeduraren parametro bat irteerakoa izanik, honako frogak egin:
  • Gehitu5Gehiago prozedura hasierakoa da eta lehen bezala:
    • Zenbaki1 parametro formala integer izanik sarrerakoa da
    • Zenbaki2 parametro formala integer izanik sarrerakoa da
  • Programa exekutatu Gehitu5Gehiago prozeduraren deia hasierako hau delarik:
    • Gehitu5Gehiago(iKopuru1, iKopuru2) ;
  • Programa exekutatu Gehitu5Gehiago prozeduraren deia aldatu adierazpen matematiko hauek jarriz:
    • Gehitu5Gehiago(iKopuru1 + 10, iKopuru2 + 20) ;
  • Aldaketa, Gehitu5Gehiago prozeduraren parametro formal baten datu-mota aldatu:
    • iKopuru1 eta iKopuru2 uneko parametroak integer dira
    • Zenbaki1 parametro formala integer bezala mantendu
    • Zenbaki2 parametro formala real datu-motara aldatu
    • Gehitu5Gehiago prozedura berriarekin, programa exekutatu deiak hauek direla:
      • Gehitu5Gehiago(iKopuru1, iKopuru2) ;
      • Gehitu5Gehiago(iKopuru1 + 10, iKopuru2) ;
      • Gehitu5Gehiago(iKopuru1, iKopuru2 + 20) ;
    • Gehitu5Gehiago hasierako egoera berreskuratu (parametro bat sarrerakoa eta bestea irteerakoa) eta prozeduraren deia aldatu konstante hauek jarriz:
      • Gehitu5Gehiago(11, 22) ;
    AzpiprogramenParametroak_04.pas programaren bitartez zer ikasi duzu?


    iKopuru1 eta iKopuru2 aldagaiak non erazagutzen diren garrantzitsua da:
    • Gehitu5Gehiago prozedura barruko lehen esleipena aldatu hau idatziz:
      • iKopuru1 := Zenbaki1 + 5 ;
      • Ikusi iKopuru1 eta iKopuru2 aldagaiak prozedura baino lehenago erazaguturik daudela
    • Gehitu5Gehiago prozedura barruko esleipen berria mantenduz, iKopuru1 eta iKopuru2 aldagaiak tokiz aldatu:
      • iKopuru1 := Zenbaki1 + 5 ;
      • iKopuru1 eta iKopuru2 aldagaiak prozedura eta gero erazagutu
    AzpiprogramenParametroak_05.pas programaren bitartez zer ikasi duzu?


    Gehitu5Gehiago prozeduraren barruan aldagai laguntzaileak sortuko ditugu, egiteko daukagun asmoa hauxe da urratsez-urrats:
    1. iLaguntzaile1 izeneko aldagaia sortu integer bezala
    2. iLaguntzaile1 izeneko aldagaiari hasieraketarik ez egin eta...
    3. ...iLaguntzaile1 aldagaiaren balioa pantailaratu prozedura barruan
    Gehitu5Gehiago prozeduraren bertako aldagaiak iker ditzagun:
    • Aurrekoa egin bi aldagai laguntzaile sortuz:
      • var iLaguntzaile1, iLaguntzaile2 : integer ;
      • iLaguntzaile1 eta iLaguntzaile2 aldagaiei hasieraketarik ez egin eta...
      • writeln('    iLaguntzaile1 = ', iLaguntzaile1, '      iLaguntzaile2 = ', iLaguntzaile2) ;
    • Aurrekoa errepikatu bi aldagai laguntzaileen sorreran ordena trukatuz:
      • var iLaguntzaile2, iLaguntzaile1 : integer ;
      • iLaguntzaile1 eta iLaguntzaile2 aldagaiei hasieraketarik ez egin eta...
      • writeln('    iLaguntzaile1 = ', iLaguntzaile1, '      iLaguntzaile2 = ', iLaguntzaile2) ;
    • Programa nagusian lan eginez iKopuru1 eta iKopuru2 aldagaien balioak pantailaratu
    • Programa nagusian lan eginez iLaguntzaile1 eta iLaguntzaile2 aldagaien balioak pantailaratu
      AzpiprogramenParametroak_06.pas programaren bitartez zer ikasi duzu?


      Programa bat daukagu fniBatuBiEtaGehitu5Gehiago izeneko funtzioari deitzen diona, honako hauek ikusi:
      • fniBatuBiEtaGehitu5Gehiago funtzioak bi parametro ditu, biak integer datu-motatakoak
      • fniBatuBiEtaGehitu5Gehiago funtzioaren bi parametroak sarrerakoak dira.
      • fniBatuBiEtaGehitu5Gehiago funtzioak irteera bakarra du eta integer datu-motatakoa da
      • fniBatuBiEtaGehitu5Gehiago funtzioari deia egitean esleipen bat idatziko da
      • fniBatuBiEtaGehitu5Gehiago funtzioaren deia adierazpen aritmetiko batean ager daiteke
      • fniBatuBiEtaGehitu5Gehiago funtzioaren deia beste azpiprograma baten uneko parametroa izan daiteke
      • fniBatuBiEtaGehitu5Gehiago funtzioak emaitza itzuliko dio programa nagusiari, emaitza den balio hori itzultzeko fniBatuBiEtaGehitu5Gehiago etiketa erabiliko du
      AzpiprogramenParametroak_07.pas programaren bitartez zer ikasi duzu?


      iZenbaki zenbaki baten faktoriala kalkulatzen duen funtzioak eragiketa hau egin behar du eta horretarako FOR-DO egitura bat erabil daiteke:
      • iZenbaki! = 1 * 2 * 3 * ... (iZenbaki - 1) * iZenbaki
        program FaktorialaKalkulatzen ;
        
        function fnliFaktoriala(iZbk:integer) : longint ;
        var
           k : integer ;
           liMetatua : longint ;
        begin
           liMetatua := 1 ;
           for k:=1 to iZbk do
           begin
              liMetatua := liMetatua*k ;
              WriteLn(k, ' ---> ', liMetatua) ;
           end ;
           fnliFaktoriala := liMetatua ;
        end ;
        
        var
          liEmaitza : longint ;
          iDatua : integer ;
        begin
           repeat
              write('Eman zenbaki osoa: ') ;
              readln(iDatua) ;
           until iDatua > 0 ;
           liEmaitza := fnliFaktoriala(iDatua) ;
           writeln(iDatua, '! = ', liEmaitza) ;
           readln ;
        end.

        Programa horretan fnliFaktoriala() funtzioari dei bakar bat egiten zaio,  programa nagusian liEmaitza aldagaiari balioa ematen zaio baino lehenago iDatua aldagaiaren balioa teklatuaren bitartez irakurri dugu. fnliFaktoriala() funtzioaren kodifikazioan FOR-DO egitura bat behar dugu eta hura kontrolatzeko k aldagaia behar dugu, faktoriala kalkulatzen duen liMetatua aldagaia beharko dugu ere.

        fnliFaktoriala() funtzioak programa nagusiari emaitza itzultzeko fnliFaktoriala etiketa erabili behar da derrigorrez, bestela liMetatua aldagaiak faktorialaren balioa gordeko du baina programa nagusiari ez zaio inolaz ere helduko.


        AzpiprogramenParametroak_08.pas programaren bitartez zer ikasi duzu?






        Gehitu5Gehiago prozedurari deituko diogu Gehitu5Gehiago prozeduraren barrutik:
        • Gehitu5Gehiago prozedura barruko esleipenak mantendu baina IF-THEN bat gehitu, honelaxe:
          • Zenbaki1 := Zenbaki1 + 5 ;
          • if Zenbaki1 <= 25 then Gehitu5Gehiago(Zenbaki1, Zenbaki2) ;
          • Zenbaki2 := Zenbaki2 + 5 ;
        • Aurrekoa errepikatu baina Zenbaki1 parametro formala irteerakoa izanik:
          • procedure Gehitu5Gehiago (var Zenbaki1: integer; Zenbaki2: integer) ;
        • Aurrekoa errepikatu IF-THEN egitura kenduz eta dei errekurtsiboa mantenduz:
          • Zenbaki1 := Zenbaki1 + 5 ;
          • Gehitu5Gehiago(Zenbaki1, Zenbaki2) ;
          • Zenbaki2 := Zenbaki2 + 5 ;

          AzpiprogramenParametroak_09.pas programaren bitartez zer ikasi duzu?






          iZenbaki zenbaki baten faktoriala kalkulatzen duen funtzio errekurtsiboa erakusten da jarraian. Faktorialaren kalkulu errekurtsiboa algoritmo honetan oinarritzen da:
          • iZenbaki! = iZenbaki * (iZenbaki - 1)!
            program FaktorialErrekurtsiboa ;
            
            function fnliFaktoriala(iZbk:integer) : longint  ;
            begin
               writeln('Dei errekurtsiboa baino lehen ---> ', iZbk) ;   
               if iZbk = 1 then
                  fnliFaktoriala := 1
               else
                  fnliFaktoriala := iZbk * fnliFaktoriala(iZbk - 1) ;
               writeln ('Dei errekurtsiboa eta gero ------> ', iZbk) ;   
            end ;
            
            var
              liEmaitza : longint ;
              iDatua : integer ;
            
            begin
               repeat
                  write('Eman zenbaki osoa: ') ;
                  readln(iDatua) ;
               until iDatua > 0 ;
               liEmaitza := fnliFaktoriala(iDatua) ;
               writeln(iDatua, '! = ', liEmaitza) ;
               readln ;
            end.


            AzpiprogramenParametroak_10.pas programaren bitartez zer ikasi duzu? Azalpenak eta irudiak ikusteko Errekurtsibitatea zertan den izeneko blog-artikulua irakurri.


             

            Collapsible content

            Hiru urrats dira hemen adierazten den bezala: Make Collapsible Content In Blogger Posts



            Bat

            Artikulua HTML moduan idaztean, kolapsatu nahi dena honela idatzi adibidez:

            Like This

            This is the upper section.

            This is the middle section.

            This is the lower section.



            Bi

            Artikulua HTML moduan idazten jarraituz Javascrpit kode hau gehitu artikuluari:

            Javascript kodea hemen...
            
            ...HTML moduan ikusi



            Hiru

            Blogaren CSS kodeari ondoko hau gehituko zaio:

            button.accordion {
            background-color: #eee;
            color: #444;
            cursor: pointer;
            padding: 18px;
            width: 100%;
            border: none;
            text-align: left;
            outline: none;
            font-size: 15px;
            transition: 0.4s;
            }
            button.accordion.active, button.accordion:hover {
            background-color: #ddd;
            }
            div.panel {
            padding: 0 18px;
            display: none;
            background-color: white;
            }
            div.panel.show {
            display: block !important;
            }
            

            Horretaroako bidea Gaia > PERTSONALIZATU > Aurreratuak > Gehitu CSSa irudi hontan erakusten den bezala:






            Beste adibide bat




            Leonardo Pisano (Pisa, Italia, 1170-1250), Leonardo Bonacci, Leonardo Fibonacci edo Fibonacci moduan ezaguna, Italiar matematikaria izan zen, Erdi Aroko ezagunetarikoa. Ezaguna da batez ere bi aurkikuntzengatik:
            • Hindu-arabiar zenbaki sistema Europan sartu zuen eta berau erabiltzeko bideak jarri zituen XIII. mendeko "Liber Abaci" liburuaren bitartez
            • Fibonacciren zenbakiak deskribatu zituen liburu berean, nahiz eta berak ez zituen aurkitu baizik eta adibide moduan jarri
            Leonardo Pisano, Fibonacci, ezagutzeko hemen duzu artikulu bat Fibonacci, el matemático que se puso a contar conejos y descubrió la secuencia divina.


            Beraz, Fibonacciren sekuentzia honako hau da:

            0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, ...


            Ondorengoa da Fibonacciren segidaren adierazpen orokorra:

            {\displaystyle F_{n}={\begin{cases}0&n=0{\mbox{ bada}}\\1&n=1{\mbox{ bada}}\\F_{n-1}+F_{n-2}&n>1{\mbox{ bada}}\\\end{cases}}}





            Beste adibide bat




            Beraz, Fibonacciren sekuentzia honako hau da:
            0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, ...


            Ondorengoa da Fibonacciren segidaren adierazpen orokorra:

            {\displaystyle F_{n}={\begin{cases}0&n=0{\mbox{ bada}}\\1&n=1{\mbox{ bada}}\\F_{n-1}+F_{n-2}&n>1{\mbox{ bada}}\\\end{cases}}}






            2023(e)ko irailaren 28(a), osteguna

            SyntaxHighlighter en Blogger

            Visto en SyntaxHighlighter Código en Blogger. Inclúyanse las siguientes líneas en la plantilla HTML del tema en cualquier punto de la cabecera (entre la marca <head> y su correspondiente marca </head> de cierre).

            <!--SYNTAX HIGHLIGHTER INICIO-->
            <link rel="stylesheet" type="text/css" href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css"/>
            <link rel="stylesheet" type="text/css" href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css"/>
            <script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript"/>
            <script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js" type="text/javascript"/>
            <script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js" type="text/javascript"/>
            <script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js" type="text/javascript"/>
            <script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js" type="text/javascript"/>
            <script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJavaFX.js" type="text/javascript"/>
            <script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript"/>
            <script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js" type="text/javascript"/>
            <script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js" type="text/javascript"/>
            <script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js" type="text/javascript"/>
            <script language="javascript">
            SyntaxHighlighter.config.bloggerMode = true;
            SyntaxHighlighter.config.clipboardSwf = "http://alexgorbatchev.com/pub/sh/current/scripts/clipboard.swf";
            SyntaxHighlighter.all();
            </script>
            <!--SYNTAX HIGHLIGHTER FIN-->

            El autor SyntaxHighlighter es Alex Gorbatchev y su código se puede descargar desde https://github.com/syntaxhighlighter/syntaxhighlighter pulsando sobre el botón Code.

            Si subimos el software del recurso SyntaxHighlighter a un repositorio nuestro (por ejemplo, a GitHub donde la página pública es https://jesusromouriarte.github.io/SyntaxHighlighter/) debemos incluir el siguiente código:

            <!-- NIRE BILTEGIA jesusromouriarte.github.io/SyntaxHighlighter/ -->
               
            <link href='https://jesusromouriarte.github.io/SyntaxHighlighter/styles/shCore.css' rel='stylesheet' type='text/css'/>
            <link href='https://jesusromouriarte.github.io/SyntaxHighlighter/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
            <script src='https://jesusromouriarte.github.io/SyntaxHighlighter/scripts/shCore.js' type='text/javascript'/>      
            <script src='https://jesusromouriarte.github.io/SyntaxHighlighter/scripts/shBrushPython.js' type='text/javascript'/>  
            <script src='https://jesusromouriarte.github.io/SyntaxHighlighter/scripts/shBrushJava.js' type='text/javascript'/>   
            <script src='https://jesusromouriarte.github.io/SyntaxHighlighter/scripts/shBrushCpp.js' type='text/javascript'/>
            <script src='https://jesusromouriarte.github.io/SyntaxHighlighter/scripts/shBrushPlain.js' type='text/javascript'/>  
            <script src='https://jesusromouriarte.github.io/SyntaxHighlighter/scripts/shBrushXml.js' type='text/javascript'/>  
            <script src='https://jesusromouriarte.github.io/SyntaxHighlighter/scripts/shBrushDelphi.js' type='text/javascript'/>
            <script language='javascript' type='text/javascript'>  SyntaxHighlighter.config.bloggerMode = true;  SyntaxHighlighter.all(); </script>
               
            <!-- SyntaxHighlighter -->



             

            Una vez modificada la plantilla del tema, estamos en condiciones de utilizar las potencialidades de SyntaxHighlighter. Ejemplo del aspecto que toma el código de un programa que se ha escrito entre las marca de apertura <pre class="brush:pascal;"> y la marca de cierre </pre> tras haber modificado la plantilla del tema:

            {---------------------------------------------------------------------------}   
            
            UNIT datu_mota;
            
            
            INTERFACE
            
            { ----------ordenagailu guztiak berdinak ez direlako------------------ }
            type
               integer = longint;   (* INTEGER-entzat 4 byte erabiltzera behartzen da *)
               real    = double;    (* REAL-entzat 8 byte erabiltzera behartzen da    *)
            
            
            { --------------------------------------------------"biblioteka"------ }
            (* "biblioteka" unitateak behar dituen konstanteak eta datu-motak *)
            (* Menuaren 1., 2., 3., 4. eta 5. aukerak erabili ahal izateko    *)
            const
               iERRESERBA_MAX = 20;  { azterketako enuntziatuan 100 }
               sBIDEA = 'C:\Datuak\';
            type
               tsKate10 = string[10];
               tsKate15 = string[15];
               tsKate55 = string[55];
               tsKate199 = string[199];
            
               trdLiburu = record
                              sLiburuKodea: tsKate15;
                              sIzenburua: tsKate55;
                              sMaileguanNori: tsKate15;
                              iAldizMaileguan: integer;
                              sKokapena: tsKate10;
                              sAzkenMaileguData: tsKate10;
                           end;
               tfrdLiburutegiFitxategia = file of trdLiburu;
            
               trdErreserba = record
                                 sLiburuKodea: tsKate15;
                                 sErabiltzaileZbk: tsKate15;
                                 sTelefonoa: tsKate10;
                                 sEskariData: tsKate10;
                              end;
               tardErreserbak = array[1..iERRESERBA_MAX] of trdErreserba;
               tfrdErreserbenFitxategia = file of trdErreserba;
            
            
            { ------------------------------------------------"erabiltzaile"------ }
            (* "erabiltzaile" unitateak behar dituen konstanteak eta datu-motak *)
            (* Menuaren 6. eta 7. aukerak exekutatu ahal izateko beharrezkoak   *)
            const
               iBEZERO_MAX = 30;
            type
               trdBezero = record
                              sNor: tsKate55;
                              sErabilKodea: tsKate15;
                              sTelefZbk: tsKate10;
                           end;
               tfrdBezeroenFitxategia = file of trdBezero;
            
            
            { -------------------------------------------------------"top10"------ }
            (* "top10" unitateak behar dituen konstanteak eta datu-motak *)
            (* Menuaren 8. aukera exekutatu ahal izateko beharrezkoak    *)
            const
               iLIBURU_MAX = 125;
            type
               trdSailkatua = record
                                 iAldizMaileguan: integer;
                                 sIzenburua: tsKate55;
                                 sLiburuKodea: tsKate15;
                              end;
               tfrdSailkatuenFitxategia = file of trdSailkatua;
               tardZerrenda = array[1..iLIBURU_MAX] of trdSailkatua;
            
            
            { -------------------------------------------------------"gurea"------ }
            (* "gurea" unitateak behar dituen konstanteak eta datu-motak *)
            (* Menuaren 9. aukera exekutatu ahal izateko beharrezkoak    *)
            
            
            
            IMPLEMENTATION
            
               (* hutsik *)
               
            END.
            
            {---------------------------------------------------------------------------}

            2023(e)ko irailaren 27(a), asteazkena

            Segundo artículo

            En este segundo artículo hablaremos de, entre otras cosas, cómo enlazar artículos de blogs. Por ejemplo, ver el artículo número 1.