Rekurzija
This presentation is the property of its rightful owner.
Sponsored Links
1 / 113

Rekurzija PowerPoint PPT Presentation


  • 95 Views
  • Uploaded on
  • Presentation posted in: General

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:

Download Presentation

Rekurzija

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 );

}


Rekurzija

void main () {

… fac(4) …

… }

int fac ( int n ) {

if ( n == 1 ) return 1;

return n * fac ( n - 1 );

}

main

fac(4)


Rekurzija

void main () {

… fac(4) …

… }

int fac ( int n ) {

if ( n == 1 ) return 1;

return n * fac ( n - 1 );

}

main

fac

n___

fac(4)

4


Rekurzija

void main () {

… fac(4) …

… }

int fac ( int n ) {

if ( n == 1 ) return 1;

return n * fac ( n - 1 );

}

main

fac

n___

fac(4)

4


Rekurzija

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


Rekurzija

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


Rekurzija

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


Rekurzija

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


Rekurzija

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


Rekurzija

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


Rekurzija

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


Rekurzija

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


Rekurzija

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


Rekurzija

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


Rekurzija

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


Rekurzija

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


Rekurzija

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


Rekurzija

void main () {

… fac(4) …

… }

main

fac

n___

2

2

fac

n___

3*2

3

fac

n___

4*fac(4-1)

fac(4)

4


Rekurzija

void main () {

… fac(4) …

… }

main

fac

n___

3*2

3

fac

n___

4*fac(4-1)

fac(4)

4


Rekurzija

void main () {

… fac(4) …

… }

main

fac

n___

6

3

fac

n___

4*fac(4-1)

fac(4)

4


Rekurzija

void main () {

… fac(4) …

… }

main

fac

n___

6

3

fac

n___

4*6

fac(4)

4


Rekurzija

void main () {

… fac(4) …

… }

main

fac

n___

4*6

fac(4)

4


Rekurzija

void main () {

… fac(4) …

… }

main

fac

n___

24

fac(4)

4


Rekurzija

void main () {

… fac(4) …

… }

int fac ( int n ) {

if ( n == 1 ) return 1;

return n * fac ( n - 1 );

}

main

fac

n___

24

24

4


Rekurzija

void main () {

… fac(4) …

… }

main

24


Rekurzija

FAC(4)

FAC(4)

4*


Rekurzija

FAC(4)

FAC(4)

FAC(3)

FAC(3)

3 *

4*


Rekurzija

FAC(4)

FAC(4)

FAC(3)

FAC(2)

FAC(3)

FAC(2)

2 *

3 *

4*


Rekurzija

FAC(4)

FAC(4)

FAC(3)

FAC(2)

FAC(3)

FAC(1)

FAC(2)

2 *

3 *

FAC(1)

4*


Rekurzija

FAC(4)

FAC(4)

FAC(3)

FAC(2)

FAC(3)

FAC(1)

FAC(2)

2 *

1

1

3 *

FAC(1)

4*


Rekurzija

FAC(4)

FAC(4)

FAC(3)

FAC(2)

FAC(3)

2

FAC(1)

FAC(2)

2 *

1

1

3 *

2

FAC(1)

4*


Rekurzija

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*


Rekurzija

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)= |1ko 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

Kaj se zgodi ob klicu fib(5)?

fib(5)


Rekurzija

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) nn*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 327684294967296

6 64 384 4096 262144 (glej 1)

7128 89616384 2097152 (glej 2)

825620486553616777216 ?????

(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


Uporabljen je povratni algoritem

Uporabljen je povratni algoritem


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.


  • Login