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

Rekurzija PowerPoint PPT Presentation


  • 110 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

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:

Ž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

  • 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

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

  • 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

  • S števcem gremo od 1 do n

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


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

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


Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)


Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)


Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)


Kaj se zgodi ob klicu fib(5)?

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)


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(5)?

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)

fib(2)

fib(1)


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(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(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(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(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(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(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(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(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(5)?

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)

1

fib(1)

1

0

1

0


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(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(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(5)?

fib(5)

fib(3)

fib(4)

fib(3)

fib(2)

1

1

1

0

1

1

0


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(5)?

fib(5)

fib(3)

fib(4)

2

fib(2)

1

1

1

0

1

1

0


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(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(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(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(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(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(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(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(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(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(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(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(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(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(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!

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

  • 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

  • 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?

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

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?

Š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

  • 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:

  • 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:

Problem bomo razdelili na podprobleme:

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


Rešitev:

Razdeli problem into a set of smaller/simpler

probleme:

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


Rešitev:

Razdeli problem into a set of smaller/simpler

probleme:

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


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š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š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š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š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š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:

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

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 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 stebri

Koliko potez??

1

Koliko potez??

1

Koliko potez??

1

+ +

Koliko je vseh potez?

Vsota gornjih potez!!


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

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


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,

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 takole formuliramo: postaviti moramo osem dam na šahovnico tako, da nobena ne napada druge.


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


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

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

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