Rekurzija
Download
1 / 113

Rekurzija - PowerPoint PPT Presentation


  • 136 Views
  • Uploaded on

Rekurzija. Gabrijela Krajnc. Rekurzja. Živel je mož, imel je psa, lepo ga je učil. Nekoč mu ukradel je kos mesa, zato ga je ubil. Na tablico zapisal je: Živel je mož, imel je psa, lepo ga je učil. Nekoč mu ukradel je kos mesa, zato ga je ubil. Na tablico zapisal je:

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' Rekurzija' - lucine


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
Rekurzija

Rekurzija

Gabrijela Krajnc


Rekurzja
Rekurzja

Živel je mož, imel je psa, lepo ga je učil.

Nekoč mu ukradel je kos mesa, zato ga je ubil.

Na tablico zapisal je:

Živel je mož, imel je psa, lepo ga je učil.

Nekoč mu ukradel je kos mesa, zato ga je ubil.

Na tablico zapisal je:

Živel je mož, imel je psa, lepo ga je učil.

Nekoč mu ukradel je kos mesa, zato ga je ubil.

Na tablico zapisal je:

Živel je mož, imel je psa, lepo ga je učil.

Nekoč mu ukradel je kos mesa, zato ga je ubil.

Na tablico zapisal je: ……


Problemi
Problemi

  • Izračunaj volumen telesa, preluknjanega nkrat

  • Poišči največje in najmanjše število v tabeli števil

  • Uredi podatke po velikosti.

  • Izračunaj produkt naravnih števil od 1 do n.


Primer faktoriela
Primer Faktoriela

Rekurzivna definicija:

n! = n * (n-1) * (n-2) * … * 3 * 2 * 1

To lahko zapišemo tudi na drugi način:

n * (n-1) * (n-2) * … * 3 * 2 * 1 =

n * (n-1)!  Faktoriela(n):

Če je n = 0, je rezultat 1

sicer pa

rezultat = n * faktoriela(n – 1)


Primer faktoriela1
Primer Faktoriela

public static int fac ( int n ) {

if ( n == 1 ) return 1;

return n * fac ( n - 1 );

}


void main () {

… fac(4) …

… }

int fac ( int n ) {

if ( n == 1 ) return 1;

return n * fac ( n - 1 );

}

main

fac(4)


void main () {

… fac(4) …

… }

int fac ( int n ) {

if ( n == 1 ) return 1;

return n * fac ( n - 1 );

}

main

fac

n___

fac(4)

4


void main () {

… fac(4) …

… }

int fac ( int n ) {

if ( n == 1 ) return 1;

return n * fac ( n - 1 );

}

main

fac

n___

fac(4)

4


void main () {

… fac(4) …

… }

int fac ( int n ) {

if ( n == 1 ) return 1;

return n * fac ( n - 1 );

}

main

fac

n___

4*fac(4-1)

fac(4)

4


void main () {

… fac(4) …

… }

int fac ( int n ) {

if ( n == 1 ) return 1;

return n * fac ( n - 1 );

}

main

fac

n___

3

fac

n___

4*fac(4-1)

fac(4)

4


void main () {

… fac(4) …

… }

int fac ( int n ) {

if ( n == 1 ) return 1;

return n * fac ( n - 1 );

}

main

fac

n___

3

fac

n___

4*fac(4-1)

fac(4)

4


void main () {

… fac(4) …

… }

int fac ( int n ) {

if ( n == 1 ) return 1;

return n * fac ( n - 1 );

}

main

fac

n___

3*fac(3-1)

3

fac

n___

4*fac(4-1)

fac(4)

4


void main () {

… fac(4) …

… }

int fac ( int n ) {

if ( n == 1 ) return 1;

return n * fac ( n - 1 );

}

main

fac

n___

2

fac

n___

3*fac(3-1)

3

fac

n___

4*fac(4-1)

fac(4)

4


void main () {

… fac(4) …

… }

int fac ( int n ) {

if ( n == 1 ) return 1;

return n * fac ( n - 1 );

}

main

fac

n___

2

fac

n___

3*fac(3-1)

3

fac

n___

4*fac(4-1)

fac(4)

4


void main () {

… fac(4) …

… }

int fac ( int n ) {

if ( n == 1 ) return 1;

return n * fac ( n - 1 );

}

main

fac

n___

2*fac(2-1)

2

fac

n___

3*fac(3-1)

3

fac

n___

4*fac(4-1)

fac(4)

4


void main () {

… fac(4) …

… }

fac

n___

main

1

fac

n___

2*fac(2-1)

2

fac

n___

3*fac(3-1)

3

fac

n___

4*fac(4-1)

fac(4)

4


void main () {

… fac(4) …

… }

fac

n___

main

1

fac

n___

2*fac(2-1)

2

fac

n___

3*fac(3-1)

3

fac

n___

4*fac(4-1)

fac(4)

4


void main () {

… fac(4) …

… }

fac

n___

main

1

1

fac

n___

2*fac(2-1)

2

fac

n___

3*fac(3-1)

3

fac

n___

4*fac(4-1)

fac(4)

4


void main () {

… fac(4) …

… }

int fac ( int n ) {

if ( n == 1 )return 1;

return n * fac ( n - 1 );

}

fac

n___

main

1

1

fac

n___

2*1

2

fac

n___

3*fac(3-1)

3

fac

n___

4*fac(4-1)

fac(4)

4


void main () {

… fac(4) …

… }

main

fac

n___

2*1

2

fac

n___

3*fac(3-1)

3

fac

n___

4*fac(4-1)

fac(4)

4


void main () {

… fac(4) …

… }

main

fac

n___

2

2

fac

n___

3*fac(3-1)

3

fac

n___

4*fac(4-1)

fac(4)

4


void main () {

… fac(4) …

… }

main

fac

n___

2

2

fac

n___

3*2

3

fac

n___

4*fac(4-1)

fac(4)

4


void main () {

… fac(4) …

… }

main

fac

n___

3*2

3

fac

n___

4*fac(4-1)

fac(4)

4


void main () {

… fac(4) …

… }

main

fac

n___

6

3

fac

n___

4*fac(4-1)

fac(4)

4


void main () {

… fac(4) …

… }

main

fac

n___

6

3

fac

n___

4*6

fac(4)

4


void main () {

… fac(4) …

… }

main

fac

n___

4*6

fac(4)

4


void main () {

… fac(4) …

… }

main

fac

n___

24

fac(4)

4


void main () {

… fac(4) …

… }

int fac ( int n ) {

if ( n == 1 ) return 1;

return n * fac ( n - 1 );

}

main

fac

n___

24

24

4


void main () {

… fac(4) …

… }

main

24


FAC(4)

FAC(4)

4*


FAC(4)

FAC(4)

FAC(3)

FAC(3)

3 *

4*


FAC(4)

FAC(4)

FAC(3)

FAC(2)

FAC(3)

FAC(2)

2 *

3 *

4*


FAC(4)

FAC(4)

FAC(3)

FAC(2)

FAC(3)

FAC(1)

FAC(2)

2 *

3 *

FAC(1)

4*


FAC(4)

FAC(4)

FAC(3)

FAC(2)

FAC(3)

FAC(1)

FAC(2)

2 *

1

1

3 *

FAC(1)

4*


FAC(4)

FAC(4)

FAC(3)

FAC(2)

FAC(3)

2

FAC(1)

FAC(2)

2 *

1

1

3 *

2

FAC(1)

4*


FAC(4)

FAC(4)

FAC(3)

6

FAC(2)

FAC(3)

2

FAC(1)

FAC(2)

2 *

1

1

3 *

2

FAC(1)

6

4*


24

FAC(4)

FAC(4)

FAC(3)

6

FAC(2)

FAC(3)

2

FAC(1)

FAC(2)

2 *

1

1

3 *

2

FAC(1)

6

4*

24


Alternativa
Alternativa

  • Namesto, da izračunavamo:n * fac ( n - 1)Lahko gremo v drugi smeri::

    1 * 2 * 3 * 4 * … * ( n - 1 ) * n

    (((((1) * 2) * 3) * 4 ) * … * (n - 1)) * n


Alternativa nadaljevanje
Alternativa - nadaljevanje

  • S števcem gremo od 1 do n

  • Za vsako ko števec povečamo za 1, faktorieli pomnožimo vrednost števca.


Naloga
Naloga

  • Napišite rekurzivno funkcijo, ki poišče vsoto N celih števil.

  • Napišite rekurzivno funkcijo, ki vpisana števila izpiše v obratnem vrstnem redu.


Drevesna rekurzija
Drevesna rekurzija

  • Predpostavimo zaporedje Fibonaccijevih števil:

    0, 1, 1, 2, 3, 5, 8, 13, 21, ...

  • To zaporedje je definirano z naslednjo formulo:

    /0Ko n = 0

    fib(n)= |1 ko n = 1

    \fib(n - 1) + fib(n - 2)drugače


Drevesna rekurzija1
Drevesna rekurzija

  • Programski kod, ki računa fibonačijeva števila je naslednji:

    int fib ( int n ) {

    if ( n <= 0 ) return 0;

    else if ( n = 1 ) return 1;

    else return fib ( n - 1 ) + fib ( n - 2 ) ;

    }



Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)


Kaj se zgodi ob klicu fib 51
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)


Kaj se zgodi ob klicu fib 52
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)


Kaj se zgodi ob klicu fib 53
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)


Kaj se zgodi ob klicu fib 54
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)

fib(2)

fib(1)


Kaj se zgodi ob klicu fib 55
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)

fib(2)

fib(1)


Kaj se zgodi ob klicu fib 56
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)

fib(2)

fib(1)

fib(1)

fib(0)


Kaj se zgodi ob klicu fib 57
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)

fib(2)

fib(1)

fib(1)

fib(0)


Kaj se zgodi ob klicu fib 58
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)

fib(2)

fib(1)

fib(1)

fib(0)

1


Kaj se zgodi ob klicu fib 59
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)

fib(2)

fib(1)

fib(1)

fib(0)

1


Kaj se zgodi ob klicu fib 510
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)

fib(2)

fib(1)

1

fib(0)

1


Kaj se zgodi ob klicu fib 511
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)

fib(2)

fib(1)

1

fib(0)

1


Kaj se zgodi ob klicu fib 512
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)

fib(2)

fib(1)

1

fib(0)

1

0


Kaj se zgodi ob klicu fib 513
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)

fib(2)

fib(1)

1

fib(0)

1

0


Kaj se zgodi ob klicu fib 514
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)

fib(2)

fib(1)

1

0

1

0


Kaj se zgodi ob klicu fib 515
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)

1

fib(1)

1

0

1

0


Kaj se zgodi ob klicu fib 516
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)

1

fib(1)

1

0

1

0


Kaj se zgodi ob klicu fib 517
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)

1

fib(1)

1

0

1

1

0


Kaj se zgodi ob klicu fib 518
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)

1

fib(1)

1

0

1

1

0


Kaj se zgodi ob klicu fib 519
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)

1

1

1

0

1

1

0


Kaj se zgodi ob klicu fib 520
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

2

fib(2)

1

1

1

0

1

1

0


Kaj se zgodi ob klicu fib 521
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

2

fib(2)

1

1

1

0

1

1

0


Kaj se zgodi ob klicu fib 522
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

2

fib(2)

1

1

fib(1)

fib(0)

1

0

1

1

0


Kaj se zgodi ob klicu fib 523
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

2

fib(2)

1

1

fib(1)

fib(0)

1

0

1

1

0


Kaj se zgodi ob klicu fib 524
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

2

fib(2)

1

1

fib(1)

fib(0)

1

0

1

1

1

0


Kaj se zgodi ob klicu fib 525
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

2

fib(2)

1

1

fib(1)

fib(0)

1

0

1

1

1

0


Kaj se zgodi ob klicu fib 526
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

2

fib(2)

1

1

1

fib(0)

1

0

1

1

1

0


Kaj se zgodi ob klicu fib 527
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

2

fib(2)

1

1

1

fib(0)

1

0

1

1

1

0


Kaj se zgodi ob klicu fib 528
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

2

fib(2)

1

1

1

fib(0)

1

0

1

1

0

1

0


Kaj se zgodi ob klicu fib 529
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

2

fib(2)

1

1

1

fib(0)

1

0

1

1

0

1

0


Kaj se zgodi ob klicu fib 530
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

2

fib(2)

1

1

1

0

1

0

1

1

0

1

0


Kaj se zgodi ob klicu fib 531
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

2

1

1

1

1

0

1

0

1

1

0

1

0


Kaj se zgodi ob klicu fib 532
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

3

2

1

1

1

1

0

1

0

1

1

0

1

0


Kaj se zgodi ob klicu fib 533
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

3

. . . . .

2

1

1

1

1

0

1

0

1

1

0

1

0


Kaj se zgodi ob klicu fib 534
Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

3

2

1

1

1

1

1

1

0

1

0

1

1

0

1

1

0

1

0

1

0


Kaj se zgodi ob klicu fib 535
Kaj se zgodi ob klicu fib(5)?

fib(5)

2

3

2

1

1

1

1

1

1

0

1

0

1

1

0

1

1

0

1

0

1

0


Kaj se zgodi ob klicu fib 536
Kaj se zgodi ob klicu fib(5)?

5

2

3

2

1

1

1

1

1

1

0

1

0

1

1

0

1

1

0

1

0

1

0


Celotno drevo klicev
Celotno drevo klicev!

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)

fib(2)

fib(1)

fib(2)

fib(1)

fib(1)

fib(0)

fib(1)

fib(0)

1

fib(1)

fib(0)

1

1

0

1

0

1

0


Merjenje kompleksnosti algoritmov
Merjenje kompleksnosti algoritmov

  • Za primerjavo različnih algoritmov uporabljamo dva merila:

    • Prostorsko zahtevnost algoritma, s katero definiramo velikostni red zahtev po pomnilniškem prostoru.

    • Časovno zahtevnost algoritma, s katerim definiramo velikostni red zahtevnosti procesiranja algoritma.


Veliki o
Veliki O

  • Kompleksnost O(1) se imenuje:

  • Kompleksnost O(N) se imenuje:

  • Kompleksnost O(NK) se imenuje:

  • Kompleksnost O(YN) se imenuje:

Konstantna kompleksnost

Linearna kompleksnost

Polinomska kompleksnost

Eksponentna kompleksnost


Kak ne je o e je tevilo operacij definirano z n
Kakšne je O, če je število operacij definirano z n?

n2 + 3n + 99 =

99n4 + 10n6 + 331256 =

3n + 25n2 - 64n3 =

n! + n2 =

9932 =

7 * log2(n) + 10n =

n*log2n + 4n =

O(n2)

O(n6)

O(n3)

O(n!)

O(1)

O(n)

O(n*log2n)


Rast kompleksnosti funkcij
Rast kompleksnosti funkcij

log(n) n n*log(n) n2 n3 2n

0 1 0 1 1 2

1 2 2 4 8 4

2 4 8 16 64 16

3 8 24 64 512 256

4 16 64 256 4096 65536

5 32 160 1024 32768 4294967296

6 64 384 4096 262144 (glej 1)

7 128 896 16384 2097152 (glej 2)

8 256 2048 65536 16777216 ?????

(1) Računalnik, ki izvaja 1 GFLOP operacij na sekundo bi to izvajal 5000 let

(2) Aproksimativno 500 miljard let


Kako izra unavamo kompleksnost
Kako izračunavamo kompleksnost?

Štejemo operacije, ki jih mora računalnik izvesti.

O(1)

O(S1) + O(S2)

  • Enostavne operacije – branje, pisanje, primerjave, pogoji, prireditveni stavki,

  • Zaporedje operacij -- S1; S2;


Hanojski stolpi i
Hanojski stolpiči

  • Rešujemo naslednji problem: dani so trije stebri, a, b in c. Na stebru a je n obročev. Vsi obroči so različne velikosti. Problem je poiskati zaporedje operacij, s katerimi prenesemo vse obroče na steber c. Prenašati smemo samo po en obroč naenkrat. Steber b lahko uporabljamo kot pomožno vmesno odlagališče. Dodatna omejitev je, da morajo biti vedno obroči na vsakem stebru urejeni po velikosti. To pomeni, da se ne sme pojaviti večji obroč na manjšem.


Re itev za prenos treh obro ev
Rešitev za prenos treh obročev:

  • 1.     prenesi najmanjši obroč iz a na c

  • 2.     prenesi srednji obroč iz a na b

  • 3.     prenesi najmanjši obroč iz c na b

  • 4.     prenesi največji obroč z a na c

  • 5.     prenesi najmanjši obroč z b na a

  • 6.     prenesi srednji obroč z b na c

  • 7. prenesi najmanjši obroč z a na c


Re itev
Rešitev:

Problem bomo razdelili na podprobleme:

1. prenesi n-1 obročev iz obroča a na b


Re itev1
Rešitev:

Razdeli problem into a set of smaller/simpler

probleme:

1. prenesi n-1 obročev iz stebra a na steber c


Re itev2
Rešitev:

Razdeli problem into a set of smaller/simpler

probleme:

1. prenesi n-1 obročev iz stebra a na steber c


Re itev3
Rešitev:

Razdeli problem into a set of smaller/simpler

probleme:

1. prenesi n-1 obročev iz stebra a na steber c

2. prenesi n-ti obroč iz stebra a na steber c


Re itev4
Rešitev:

Razdeli problem into a set of smaller/simpler

probleme:

1. prenesi n-1 obročev iz stebra a na steber c

2. prenesi n-ti obroč iz stebra a na steber c


Re itev5
Rešitev:

Razdeli problem into a set of smaller/simpler

probleme:

1. prenesi n-1 obročev iz stebra a na steber c

2. prenesi n-ti obroč iz stebra a na steber c


Re itev6
Rešitev:

Razdeli problem into a set of smaller/simpler

probleme:

1. prenesi n-1 obročev iz stebra a na steber c

2. prenesi n-ti obroč iz stebra a na steber c

3. prenesi n-1 obročev iz stebra b na steber c


Re itev7
Rešitev:

Razdeli problem into a set of smaller/simpler

probleme:

1. prenesi n-1 obročev iz stebra a na steber c

2. prenesi n-ti obroč iz stebra a na steber c

3. prenesi n-1 obročev iz stebra b na steber c


Re itev8
Rešitev:

Razdeli problem into a set of smaller/simpler

probleme:

1. prenesi n-1 obročev iz stebra a na steber c

2. prenesi n-ti obroč iz stebra a na steber c

3. prenesi n-1 obročev iz stebra b na steber c


Splo na re itev
Splošna rešitev:

V splošnem lahko rešitev problema za n obročev sestavimo iz treh faz:

1.1. faza: Premesti zgornjih (n-1) obročev s stebra a na steber b; pri tem lahko uporabljaš steber c kot pomožno odlagališče.

2.2. faza: Prenesi preostali obroč z a na c

3.3. faza: Premesti (n-1) obročev z b na c; pri tem lahko uporabljaš steber a kot pomožno odlagališče.


Verzija s tirimi stebri
Verzija s štirimi stebri

Koliko potez??

Razdeli problemv enostavnejšeprobleme

Koliko potez??

1

Koliko potez??

Razdeli problemv enostavnejšeprobleme

+ +

Koliko je vseh potez?

Vsota gornjih potez!!


Verzija s tirimi stebri1
Verzija s štirimi stebri

Koliko potez??

Razdeli problemv enostavnejšeprobleme

Koliko potez??

1

Koliko potez??

Razdeli problemv enostavnejšeprobleme

+ +

Koliko je vseh potez?

Vsota gornjih potez!!


Verzija s tirimi stebri2
Verzija s štirimi stebri

Koliko potez??

1

Koliko potez??

1

Koliko potez??

1

+ +

Koliko je vseh potez?

Vsota gornjih potez!!


Program in rekurzivna funkcija
Program in rekurzivna funkcija

#include <iostream.h>

void hanoi ( int n,

char zacetni,

char odlagalisce,

char koncni)

if ( n > 0 )

{

hanoi(n-1,zacetni,koncni,odlagalisce);

cout << "Prenesi obroc iz stebra " <<zacetni

<< " na steber " <<koncni << endl;

hanoi (n-1,odlagalisce, zacetni, koncni);

}

}

void main()

{

int N;

cout << "Vpiši število stolpičev? ";

cin >> N;

hanoi(N,'A','B','C');

}


Quicksort
Quicksort

Najprej določimo indeks elementa , ki je na sredini polja je na sredini polja (x = polje[l+r], kjer l pomeni indeks levega dela (na začetku je 0), r pa pomeni indeks desnega dela (na začetku je n)). Vsi elementi, ki imajo indeks manjši od indeksa sredinskega elementa, morajo biti manjši od sredinskega elementa. Vsi elementi, ki imajo indeks večji od indeksa sredinskega elementa pa morajo biti večji od sredinskega elementa. Ko temu kriteriju zadostimo, kličemo funkcijo rekurzivno, tako da na isti način sortiramo še elemente na levi strani od sredinskega elementa (Quick(l, j)) in elemente na desni strani od sredinskega elementa (Quick(i,r)).


Quicksort1
QuickSort

void QuickSort(int Polje[], int m, int n)

{

int i, j;

if (m < n) {

i = m; j = n;

Delitev(Polje,i,j);

QuickSort(Polje,m,j);

QuickSort(Polje,i,n);

}

}

main()

{

const int n=16;

int polje[n]={44,55,12,42,94,6,18,67,3,13,99,15,23,77,59,17};

Izpisi(polje, n);

QuickSort(polje,0,n);

Izpisi(polje,n);

return 0;

}

void Delitev (int Polje[], int& i, int& j)

{

int Srednji, Temp;

Srednji = Polje[ (i + j) / 2 ] ;

do {

while (Polje[i] < Srednji) i++;

while (Polje[j] > Srednji) j--;

if (i <= j) {

Temp = Polje[i];

Polje[i] = Polje[j];

Polje[j] = Temp;

i++; j--;

}

} while (i <= j);

}


Primer izpisa za etno polje 44 55 12 42 94 6 18 67 3 13 99 15 23 77 59 17
Primer izpisa:Začetno polje:44, 55, 12, 42, 94, 6, 18, 67, 3, 13, 99, 15, 23, 77, 59, 17,

Program izvaja naslednje zamenjave:

3, 55, 12, 42, 94, 6, 18, 67, 44, 13, 99, 15, 23, 77, 59, 17,

3, 17, 12, 42, 94, 6, 18, 67, 44, 13, 99, 15, 23, 77, 59, 55,

3, 17, 12, 42, 23, 6, 18, 67, 44, 13, 99, 15, 94, 77, 59, 55,

3, 17, 12, 42, 23, 6, 18, 15, 44, 13, 99, 67, 94, 77, 59, 55,

3, 17, 12, 42, 23, 6, 18, 15, 13, 44, 99, 67, 94, 77, 59, 55,

3, 17, 12, 13, 23, 6, 18, 15, 42, 44, 99, 67, 94, 77, 59, 55,

3, 17, 12, 13, 15, 6, 18, 23, 42, 44, 99, 67, 94, 77, 59, 55,

3, 6, 12, 13, 15, 17, 18, 23, 42, 44, 99, 67, 94, 77, 59, 55,

3, 6, 12, 13, 15, 17, 18, 23, 42, 44, 55, 67, 94, 77, 59, 99,

3, 6, 12, 13, 15, 17, 18, 23, 42, 44, 55, 67, 59, 77, 94, 99,

3, 6, 12, 13, 15, 17, 18, 23, 42, 44, 55, 59, 67, 77, 94, 99,

Končna razvrstitev je naslednja:

3, 6, 12, 13, 15, 17, 18, 23, 42, 44, 55, 59, 67, 77, 94, 99,


Problem osmih dam
Problem osmih dam

Problem osmih dam takole formuliramo: postaviti moramo osem dam na šahovnico tako, da nobena ne napada druge.


Algoritem problem osmih dam
Algoritem – problem osmih dam

Poskusi (I)

Inicializiraj izbiro za I-to damo

do

{Naredi naslednjo izbiro

if izbira je možna

{ postavi damo na to pozicijo

if (I < 8)

{ Poskusi(I+1)

if (ni možno postaviti I+1 dame)

{Umakni potezo, ki si jo izvedel v tem klicu funkcije

}

}

}

}

while nisi uspel ali ni na voljo nobene proste pozicije



Problem skaka a
Problem skakača

Podana je šahovska deska velikosti n x n z n2 polji. Skakača, ki se premika kot v šahu postavimo na polje s koordinatama x0 in y0. Problem je najti prekritje celotne deske, če le obstaja, to je pot skakača, ki vsebuje n2 – 1 potez, pri čemer skakač pristane na vsakem polju enkrat.


Algoritem problem skaka a
Algoritem – problem skakača

Poskusi naslednjo potezo

Inicializiraj potezo

do

{izberi kandidata za naslednjo potezo iz seznama možnih naslednjih potez

if poteza je možna

{ zabeleži potezo

if šahovnica še ni popolnoma zasedena

{ Poskusi naslednjo potezo

if poteza ni možna

{Zbriši zabeleženo potezo

}

}

}

}

while ni uspelo izvesti vseh potez ali ni več možnih potez


Doma a naloga
Domača naloga

Napišite program, ki bo izpisal dano desetiško število N v številskem sestavu z osnovo S (naj bo 1 < S < 10). Za pretvorbo uporabite rekurzivni algoritem.

Napišite program, ki bo izpisal vse možne permutacije N števil.