Programozási tételek specifikációja Alapvető fogalmak és jelölések: H halmaz tetszőleges (véges) halmaz a szokásos halmaz műveletekkel és konstanosokkal (,,,,,,\,, Számosság) logikai értékek halmaza: {Igaz,Hamis} a szokásos műveletekkel (,,,, ), kvantorokkal (, ) és indivíduum változokkal, halmazokkal természetes számok halmaza {0,,...} a szokásos műveletekkel (+,-, *,Div,Mod) egész számok halmaza {.., -, 0,,...} a szokásos műveletekkel (+,-, *,Div,Mod) valós számok halmaza a szokásos műveletekkel (+,-,*,/,^) karakterek halmaza {,,, A,, z, } szövegek halmaza H-Sorozat H-beli elemek -esek ( ), amelyen alapműveletként értelmezzük az i. elem (i {..}) kiválasztását: si:= az S sorozat i. eleme 2, valamint az eleme relációt: x S, ha i: x=s i, és a sorozathossz függvényt, ekkor Hossz(S)= H halmaz H-beli -elemű sorozatok halmaza H * halmaz H-beli véges sorozatok halmaza, azaz H * = (i=0.. ) H i () H * üres sorozat S=() Hossz(S) [x..y] index-intervallum [x..y]:={x,x+,...,y-,y} x,y I[x..y] index-sorozat I[x..y]:=(x,x+,...,y-,y) y-x, ha y x I[x..y]:=(), egyébként F(H,S) függvényhalmaz F(H,S):={ f : f:h S } H-ból S-be képez Rendezés( H) H F(HxH, ) rendezési reláció (infix jelölésű bináris függvény) ha lehet: H helyett H halmaz RendezettHalmaz (H) S H * sorozat RendezettSorozat (S) S H * sorozat HalmazFölsorolás(S) X&Y konkatenációja X és Y sorozatoknak X Y X sorozat részsorozata Y sorozatnak ha a H: a a (reflexív), a,b,c H: a b és b c a c (tranzitív), a,b H: a b és b a a=b (antiszimmetrikus) a,b H: a b vagy b a (teljes) ha h,j H: h j vagy h j (ha H véges maximális, minimális eleme) ha RendezettHalmaz (H) és i [..): s i s i+ ha i,j [..]: i j s i s j X&Y:=(x,...,x,y,...,y M), ahol =Hossz(X) és M=Hossz(Y) x X: y Y: x=y és i,j [..Hossz(X)]: i<j: x i,x j X k,l [..Hossz(Y)]: k<l: (x i=y k és x j=y l) Pl. i H: T(i) logikai kifejezésben az i individuumváltozó, a H az individuumhalmaz. A kifejezést így értjük: létezik olyan H-beli i elem, amelyre teljesül a T predikátum. 2 Vegyük észre a jelölési finomságot : a sorozatot nagybetűvel, de annak valamely elemét kisbetűvel fogjuk jelölni.
R\r sorozat r H, R H : HalmazFölsorolás(R) P(R) az R H Permutációhalmaza X,Y a Z felbontása (X,Y,Z sorozatok) T i:h i [..K] H-partícionálása ha r R R\r H - és R=R &(r)&r 2 R\r=R &R 2 ha r R R\r R P(R):={S H : = S=R, > S=s&S és s R és S P(R\s)} ha Z=X&Y x H: (i=..k) T i(x)=igaz és (T i(x) T j(x)=hamis (i j)) Definíció: Az F:H * S * feladat elemenként feldolgozható, x H * x,x x-felbontásra igaz, hogy F(x)&F(x)=F(x). Lemma: Ha az F:H * S * feladat elemenként feldolgozható, akkor f:h S függvény, hogy f(h i)=s i i [..]. 2
Tételek szerkezete: bemenet, kimenet, előfeltétel, utófeltétel A függvényként (is) szerepeltetés célja, hogy már ránézésre is kitünjön, mely sémák (absztrakt algoritmusok) melyekkel kombinálódhatnak. Ez később nagy segítségünkre lesz a bonyolultabb feladatok megoldásánál. Megállapodások: A tételeket mint függvényeket is megadjuk (a fejsorban, az ún. szignatúrában), amelynek argumentuma tartalmazza azokat a kellékeket, amelyek a szükséges bemenetei, ill. az értékét, amely halmazba képez. A tétel-függvény paramétereinek sorrendje megegyezik a Be -részben szereplő adatok sorrendjével. A kimenet halmaza megegyezik a Ki -részben felsorolt adatok értékhalmazának direktszorzatával. A sorozatokat gyakorta két adattal írjuk le: a hosszával és az elemeket tartalmazó adatszerkezettel. E jelöléssel hívjuk föl a figyelmet arra, hogy pusztán ilyen szintaktikai természetű dolog (mint a paraméterek, ill. eredményhalmazok száma és mibenléte) is segítségünkre lehet a tételek összeépítésénél. A tétel-függvény szignatúrájának és a Be + Ki -résznek a kapcsolatát segíti értelmezni a 0.-ként említett tétel színezése. Szívesebben adunk meg egy sorozatot H * -beliként (H helyett), mivel a specifikációban legkevésbé így köti meg a kezünket (nem utal a leírás tömbre vagy más fixhosszúságú szerkezetre). Ekkor viszont a sorozat és hossza mint rendszerint megjelenő bemeneti információ kapcsolat nélkül marad; ezt a hiányzó információt kell beilleszteni az előfeltételbe, felhasználva a sorozatokra előredefiniált Hossz függvényt. A tétel-függvényben éppen ezen megfontolásból nem tüntetjük föl a sorozatok elemszámát szimbolizáló paramétereket. 0. Másolás(H *,F(H,S)):S * Be:, X H *, f:h S Ki: Y S * Ef: Hossz(X)= a feladat elemenként feldolgozható az f függvénnyel Hossz(Y)= i [..]: y i=f(x i). Sorozatszámítás(H *,F(H *,H)):H lehetne még Sorozatszámítás(H *,F(H *,H 2)):H 2 Be: Ki: Ef:, X H *, F:H * H S H Hossz(X)= ( f:h H H f 0 H): ( F((x,..,x ))=f(f(x,..,x -),x ) F(())=f 0 h H:f(f 0,h)=h ) S=F(X). Sorozatszámítás(H *,H,F(H H,H)):H lehetne még Sorozatszámítás(H *,S,F(H 2 H,S)):H 2 Be: Ki: Ef: Def:, X H *, f:h H H, f 0 H S H Hossz(X)= h H:f(f 0,h)=h S=F(X) F:H * H F((x,..,x ))=f(f(x,..,x -),x )) F(())=f 0 ) 2. Eldöntés(H *,F(H,L)):L Ki: VA L Ef: Hossz(X)= VA i [..] : T(x i) 3. Kiválasztás(H *,F(H,L)): Ki: SORSZ Ef: Hossz(X)= i [..]: T(x i) SORSZ [..] T(x SORSZ) 3
4. (Lineáris) keresés(h *,F(H,L)):L L Ki: VA L, SORSZ Ef: Hossz(X)= VA i [..] : T(x i) VA SORSZ [..] és T(x SORSZ) 5. Megszámolás(H *,F(H,L)): Ki: DB Ef: Hossz(X)= DB = i T ( x i ) 6a. Maximum-kiválasztás(H *,F(H H,L)): (index) Be:, X H *, F(H H,L) Ki: MAXI Ef: Hossz(X)= Rendezés( RendezettHalmaz (H) MAXI [..] i [..]: x MAXI x i 6b. Maximum-kiválasztás(H *,F(H H,L)):H Be:, X H *, F(H H,L) Ki: MAX H Ef: Hossz(X)= Rendezés( RendezettHalmaz (H) MAX X i [..]: MAX x i 7a. Kiválogatás(H *,F(H,L)): * (index-sorozat) Ki: DB, Y * Ef: Hossz(X)= Uf : Uf 2: DB= i T ( x DB= i T ( x i ) i ) Y [..] DB ( T(x yi ) i [..DB] ) HalmazFölsorolás(Y) Y [..] DB ( T(x yi ) i [..DB] ) Y 7b. Kiválogatás(H *,F(H,L)):H * (értéksorozat) Ki: DB, Y H * Ef: Hossz(X)= DB= i T ( x i ) Y H DB Y X T(y i) i [..DB] 8. BelsőRendezés(H *,F(H H,L)):H * Be:, X H *, F(H H,L) Ki: X' H * (X új értéke) Ef: Hossz(X)= Rendezés( X' P(X) RendezettSorozat (X') 4
9. IndexesRendezés(H *,F(H H,L)): * (index-sorozat) Be:, X H *, F(H H,L) Ki: F * (felsoroló vektor) Ef: Hossz(X)= Rendezés( X=X' F P((,2,,)) RendezettSorozat (X F) (azaz i,j [..]: (i<j) x fi x fj f i f j) második változat: Be: Ki: Ef:, X H *, F(H H,L) S * (sorrend-vektor) Hossz(X)= Rendezés( X=X' S P((,2,,)) i,j [..]: (i<j) x i x j s i s j 0. Szétválogatás(H *,F i(h,l) (i=..k)):(h * ) K Be: Ki: Ef:, X H *, K, T i:h L (i=..k) DB i, Y i H * (i=..k) Hossz(X)= K 2 T i (i=..k) H partícionálása DB i= Y i H DB i Y i X j [..DB i]: T i(y ij ) (i=..k) j Ti ( x j ) Megjegyzések:. Alapvariációja : indexsorozatokkal történő szétválogatás Szétválogatás(H *,F i(h,l) (i=..k)):( * ) K 2. Kétfelé szétválogatás: (T :=T, T 2:= nem-t) Szétválogatás(H *,F(H,L)):( H * ) 2 a. Külön, két outputsorozatba b. Helyben: elválasztó indextől balra a T-, jobbra a nem-t-tulajdonságúakat. Metszet(H *,H * ):H * Be:, X H *, M, Y H * Ki: DB, Z H * [pontosabban Z H DB, DB min(,m)] 3 Ef: Hossz(X)= HalmazFölsorolás(X) Hossz(Y)=M HalmazFölsorolás(Y) DB = Z H DB HalmazFölsorolás(Z) i xi Y ( z i X z i Y i [..DB] ) 2. Egyesítés(H *,H * ):H * Be:, X H *, M, Y H * Ki: DB, Z H * [pontosabban Z H DB, DB +M] Ef: Hossz(X)= HalmazFölsorolás(X) Hossz(Y)=M HalmazFölsorolás(Y) M DB = + Z H DB HalmazFölsorolás(Z) j y X j ( z i X z i Y i [..DB] ) 3 Ez a megjegyzés a deklaráció szempontjából lehet fontos. 5
3. Összefuttatás(H *,H *,F(H H,L)):H * Be: Ki: Ef:, X H *, M, Y H *, F(HxH,L) DB, Z H * [pontosabban Z H DB, DB +M] Rendezés( Hossz(X)= HalmazFölsorolás(X) Hossz(Y)=M HalmazFölsorolás(Y) RendezettSorozat (X) RendezettSorozat (Y) M DB = + Z H DB HalmazFölsorolás(Z) RendezettSorozat (Z) j y X j ( z i X z i Y i [..DB] ) Keresések Új fogalmak: L H * lehetségesek sorozata az eredeti X egy alkalmasan választott rész-sorozata: L X. : H * hossz sorozat hossza (elemszáma) : H * H * szűkítés L H * : (L)=L L > L : H * elemkiválasztás L H * : (L) [..L] Ezen fogalmakkal az általános keresés tétel megfogalmazása: L:=X Ciklus amíg L >0 és nem T(X( (L))) L:= (L) Van:= L >0 Ha Van akkor Sorsz:= (L) ézzük a lineáris keresés tétel újrafogalmazását! L:={x i: i [e..]} (elejétől végig, e: ahol tartunk=..+) L azonosítható, sőt helyettesíthető is az első elemének indexével: L:=L(e) e (L(e)):=x e (első elem) (L(e)):= {x i i [e+..]} {x i i [e..]} L(e) :=-e+ L:=X [i:=,.-nél kezdődik a... sorozat] Ciklus amíg L >0 [i, azaz még van hol keresni] és nem T(X( (L))) [T(X(i)), azaz az i. olyan-e] L:= (L( (L))) [i:=i+, a következőnél kezdődik a... sorozat] Van:= L >0 [i, azaz lenne még hol keresni, de megvan] Ha Van akkor SORSZ:= (L).sorsz [SORSZ:=e] A közismert keresésekben az alábbi értelmezésű függvényeket szoktuk használni:. ((x i,...,x j)):=i (első) 2. u((x i,...,x j)):=j (utolsó) 3. k((x i,...,x j)):=(i+j) DIV 2 (középső) 4. ((x i,...,x j)):=(x i+,...,x j) (első elem nélkül) 5. u((x i,...,x j)):=(x i,...,x j-) (utolsó elem nélkül) 6'. k<((x i,...,x j)):=(x l,...,x m) (x i,...,x j), ahol l=i és m=(i+j DIV 2)- 6". k>((x i,...,x j)):=(x l,...,x m) (x i,...,x j), ahol l=(i+j DIV 2)+ és m=j 7. <((x i,...,x j)):=(x' l,...,x' k) (x i,...,x j) x' m<x i m [l..k] (elsőnél kisebbek) 6
4. LineárisKeresésRendezetben(H *,H,F(H H,L)):L L Be:, X H *, y H, T y:h L (T y(h) h=y h H), F(H H,L) Ki: VA L, SORSZ Ef: Hossz(X)= Rendezés( RendezettSorozat (X) VA i [..] : x i=y VA SORSZ [..] x SORSZ=y Absztrakt algoritmus: L:={x i: i [e..]} (elejétől végig, e: ahol tartunk=..+) Az e a sorozat elejét jelöli, amelyben még lehet a keresett. Figyelem: az L sorozat még annak előtte, hogy az. eleméhez érnénk, véget érhet! (Ha x>y bekövetkezett.) L azonosítható, sőt helyettesíthető is az első elemének indexével: L:=L(e) e (L(e)):= (L(e)):=e (a mindenkori első elem) (L(e)):={x i: i [e+..]}, ha x e y () (L(e)):={x i: i [+..]}, ha x e>y (2) () és (2) {x i: i [e..]} L(e):=-e+ (L(e)>0 -e+>0 e) e:= Ciklus amíg e és X(e) y Elágazás X(e)<y esetén e:=e+ X(e)>y esetén e:=+ Elágazás vége Van:= e Ha Van akkor SORSZ:=e Vegyük észre:. a ciklusból kilépünk, ha 'nem e vagy X(e)=y' teljesül; <e találunk nagyobbat: X(e)>y (l. definícióját) vagy egyszerűen a sorozat végére érünk: +=e 2. Így a ciklusfeltételre következő igaz: e és X(e) y nem (X(e)>y vagy +=e) és X(e) y X(e) y és +>e és X(e) y +>e és X(e)<y e és X(e)<y 3. Ezen átalakítás után a ciklusmagban fölöslegessé vált az elágazás, hiszen az első ág triviálisan igaz, a másik meg sohasem igaz. 4. Ezzel viszont a kilépés okát már nem jelzi egyértelműen az ' e' feltétel (hiszen az L sorozat üresre állítását nem végzi el senki): egybemosódott a sikeres és az értelmetlen keresést meggátoló kilépés. A sikerességet jelenti az ' e és X(e)=y' feltétel teljesülése. Vagyis: e:= Ciklus amíg e és X(e)<y e:=e+ Van:= e és X(e)=y Ha Van akkor SORSZ:=e 5. Egyszerűsödik az algoritmus, ha sikerül egyszerűsíteni e szétválás érzékelése. A trükk mindössze annyi, hogy az utolsó elem előtt kilépünk, s ennek vizsgálatára redukáljuk a problémát: e:= Ciklus amíg e és X(e)<y e:=e+ Van:=X(e)=y Ha Van akkor SORSZ:=e 7
5. LogaritmikusKeresés(H *,H,F(H H,L)):L L Be:, X H *, y H, T y:h L (T y(h) h=y h H), F(H H,L) Ki: VA L, SORSZ Ef: Hossz(X)= Rendezés( és RendezettSorozat (X) elem:h H szelekciós függvény: elem(x,i)=x i VA i [..] : x i=y VA SORSZ [..] x SORSZ=y Absztrakt algoritmus: L:={x i: i [e..v]} (a mindenkori eleje, vége, kezdetben: (,)) L azonosítható, sőt helyettesíthető is az első és az utolsó elemének indexével: L:=L(e,v) (e,v) (L(e,v)):= k(l(e,v)):=(e+v) DIV 2 (középső elem) (L(e,v)):= k (L(e,v)), ha x L(e,v)<y () (L(e,v)):= k (L(e,v)), ha x L(e,v)>y (2) L(e,v) :=v-e+ ( L(e,v) >0 v-e+>0 v e) (e,v):=(,) Ciklus amíg v e és X((e+v) DIV 2) y Elágazás X((e+v) DIV 2))>y esetén (e,v):=(e,((e+v) DIV 2)-) X((e+v) DIV 2))<y esetén (e,v):=(((e+v) DIV 2)+,v) Elágazás vége Van:=v e Ha Van akkor SORSZ:=(e+v) DIV 2 Az egyszerűbb leírhatóság érdekében tároljuk az (L(e,v))-dik (=(e+v) DIV 2) elem indexrészét a k változóban, e leválasztás viszont a külön kiszámolást jelenti! Másrészt az 'X(k) y' feltétel kétirányúra egyszerűsíti a ciklusmagot. Így az alábbi algoritmus marad: (e,v):=(,); k:=(e+v) DIV 2 Ciklus amíg v e és X(k) y Ha X(k)>y akkor v:=k- különben e:=k+ k:=(e+v) DIV 2 Van:=v e Ha Van akkor SORSZ:=k 6. VisszalépésesKeresés((H * H * 2...),F(H H 2...,L)):L L * Be: K, M * (K hosszú méretsorozat), Y i H * i ( i [..K]) (M i elemszámú lehetőségsorozatok), K i l: H j L i = j (lehetőségek összeférése), Ki: VA L, X * (az összeférő lehetőségek indexeinek sorozata) Ef: K 2 Hossz(M)=K HalmazFölsorolás(Y i) i [..K] j [..K], i [..j] l(h,...,h j) l(h,...,h i) VA Z Y Y 2... Y K: l(z) VA y ( x i) Y i és l( y (,..., ) i x ) y ( x k) k Absztrakt algoritmus: K L: A keresett megoldás a x i Y i K-dimenziós tér egy pontja, amely kielégíti az l-t. Ennek megadását az X-tömb végzi az Y i-beli komponensek indexeinek felsorolásával. A megoldás keresése során e teret kell 8
ügyesen bejárnunk, lehetőleg úgy, hogy ne kelljen mind az M *...*M K pontjának vizsgálatát elvégeznünk. Ezt úgy tesszük, hogy szisztematikusan szűkítjük a teret egyre szűkülő alterek uniójára, azáltal, hogy újabb és újabb komponensét kötjük meg a leendő megoldásnak. Kezdetben csak az. dimenzióban lesz kötött érték. Ekkor tehát a térnek azt a K- dimenziós alterét szemeltük ki további vizsgálatra, amelynek. komponense éppen a rögzített érték. A vizsgálatra szoruló pontok halmaza még a teljes tér. Amikor kiderül a komponensek konkretizálása során, hogy a koncentrált altér nem tartalmazhatja a megoldást, akkor a teljes alteret elvetve vesszük a szomszédos (valamelyik soron következő, azaz a megfelelő Y i-beli későbbi elem által meghatározott) alteret. Ezek után az L a következő indexsorozatok halmaza: az (,,..., ), első elemek sorozatától az (m,m 2,...,m K) utolsó sorozatig tart. (Az m i= Y i.) (Formális okok miatt egészítsük ki a fenti teret olyan elemekkel is, amelyek bármely koordinátája a 0 is lehet.) Ezt a halmazt tesszük pontok sorozatává az és függvények segítségével. A gondolatmenetből nyilvánvaló, hogy a pontfelsorolás alapja az L-beli sorozatok kezdőszeletei lesznek. Az aktuális L azonosítására mód van a kiinduló sorozat nem triviális (azaz rögzített) elemeket tartalmazó kezdőszelete által: L:=L(x,x 2,...x i) (az x i-k az indexeket jelentik), elvárjuk, hogy L(x,x 2,...x i)=l(x,x 2,...x i,0,...,0). Vegyük észre az L alábbi tulajdonságait!. Az összes lehetőség L halmaza: L(,,...,). 2. Monoton csökkenés: a. L(x,...,x i) L(x,...,x i+) x i+ [..m i+], azaz előrehaladáskor nem csökken a vizsgálatban szereplők száma; b. L(x,...,x i) L(x,...,x' i-) x' i- (x i-..m i-]. azaz visszalépéskor éppen annyival csökken, ahány dimenziós alteret sikerült kizárni a további vizsgálatból, pontosabban éppen az {(x,...,x i-,x'i,...,x'k) : j (i..k] x'j [..m j] } alteret, ami elemszáma m ; c. L(x,...,x i) L(x,...,x' i) x' (x i..m i], azaz többszörös visszalépés után az átlépett alterekbeli elemekkel csökkenthető a vizsgálat; d. a b. és a c.-ből következik, hogy a legkisebb L(x,...,x i) az L(), amely az L(x m )-ből való visszalépés után adódik. Ebben 0 darab elem van. Az L-mérték nyomon követését végzi a. függvény, így elkerülhetetlen ennek matematikai megragadása. yilvánvaló lehetőség lenne az előbbiekre építve a még ki nem szórt pontok számával mérni. Ennél lényegesen egyszerűbb mód is van. A d. figyelembe vételével az L üressé válását észlelhetjük az éppen a lerögzített elemek számának figyelésével: amikor az 0-ra csökken, akkor ürült ki a tér is. Az értelmezése következik: (L(x,...,x i)):=(x,...x i,0,...,0) ézzük a meghatározását! L( x,..., xi, xi (L(x,...,x i)):=, ( L( x,..., xi K j i j ),0)),i K l( x,..., x, x ), i l( x,..., x, x ) * j [.. i) : z i i i i ( x.. m ]: l( x,..., z ) * j j j j Magyarázatok, jelölések, megállapodások és megállapítások:. * x' v jelentése: x' v (x v..m v] és az első olyan..., illetve ha x' v korábbi értéke (azaz x' v=0), akkor x' v [..m v] és olyan. 2. Természetesen a második ágra csak az első ág feltételének nem teljesülése esetén kerülhet sor. 3. Az i jelölje a vizsgált megoldássorozat nem triviális kezdőszeletének hosszát! Ekkor L>0 i. 4. A keresett elemig akkor jutunk, amikor i>k. 5. incs meg a keresett elem (azaz L= ), ha i<. 6. (Mint nyilvánvaló:) az L-t az i és az X együtt határozzák meg! Így pl. L:=X i:=: X:=0 9
Az algoritmus: Típus Keresett=Rekord(van:Logikai,melyik:Egész) i:= [i. kezdőszeletnél tartunk] X(..):=0 [még nincs rögzített] Ciklus amíg i és i K ker:=jóelem(i) [az i.-ig lehetséges-e a kiválasztás?] Elágazás I K és ker.van esetén X(i):=ker.melyik; i:+ i esetén X(i):=0; i:- Elágazás vége Van:=i [X-ben található a megoldás, ha létezik] Mivel a ciklusban csak i és i K esetben vagyunk, s csak ekkor történhet az i növelése, vagy csökkentése, ezért a kétirányú elágazás helyett írható Ha-típusú elágazás is, egyszerűbb feltétellel. Így kapjuk: i:= [i. kezdőszeletnél tartunk] X(..):=0 [még nincs rögzített] Ciklus amíg i és i K ker:=jóelem(i) [az i.-ig lehetséges-e a kiválasztás?] Ha ker.van akkor X(i):=ker.melyik; i:+ különben X(i):=0; i:- Van:=i [X-ben található a megoldás, ha létezik] Függvény JóElem(i:Egész): Keresett [i.-ig nem triviális sorozat megoldás-e?] j:=x(i)+ Ciklus amíg j M(i) és nem Lehetséges(i,j) j:+ JóElem.van:=j M(i) Ha JóElem.van akkor JóElem.melyik:=j Függvény vége. Függvény Lehetséges(i,j:Egész): Logikai [i. komponens összefér-e az eddigiekkel?] Lehetséges:=l(Y()(X()),...,Y(i-)(X(i-)), Y(i)(j)) Függvény vége. A visszalépéses keresés (backtrack) elvének beépítése más tételekbe Mindössze annyi az észreveendő, hogy. L>0 i 2. T( (L)) i K 3. (L, (L)) keresett:=jóelem(i) Ha keresett.van akkor X(i):=keresett.melyik; i:+ különben X(i):=0; i:- Így pl. a megszámolás tétel variánsa a következő lesz. Annyi előzetes átalakításra szükség van, hogy a megszámolás tétel számlálásos ciklusát amíg -osra kell átírni. Db:=0 i:=; X(..K):=0 0
Ciklus amíg i Ha i>k akkor Db:+; i:- [visszalép a K. komponenshez] keresett:=jóelem(i) Ha keresett.van akkor X(i):=keresett.melyik; i:+ különben X(i):=0; i:-... vagy a maximum-kiválasztás... (Itt feltételezzük, hogy rendezés az L téren, ami X megoldásokat összevethetővé tesz. Az egyszerűség kedvéért föltesszük, hogy az L legkisebb eleme az (0,...,0).) i:=; X(..K):=0 Max:=X [az eddigi legnagyobb, legjobb megoldás] Ciklus amíg i Ha i>k akkor Ha Max<X akkor Max:=X i:- [visszalép a K. komponenshez] Elágazás vége keresett:=jóelem(i) Ha keresett.van akkor X(i):=keresett.melyik: i:+ különben X(i):=0 : i:- Van:=i [Max-ban található a megoldás, ha létezik]