Rekursive algoritmer

En rekursiv algoritme er en metode, hvor et problem løses ved at henvise til en mindre udgave af sig selv. Idéen svarer til rekursive definitioner i matematik: vi starter med en basis, og derefter følger et rekursivt skridt, som gentager algoritmen på en enklere del af problemet.

 

 

Fra definition til kode

Når vi har en rekursiv definition, kan den ofte oversættes direkte til en algoritme. Man skal blot oversætte:

 

  • Basis: hvornår algoritmen kan stoppe.
  • Rekursivt skridt: hvordan problemet reduceres og algoritmen kalder sig selv.

 

 

Eksempel: Fakultet

Fakultetsfunktionen er defineret rekursivt som

 

$$ \large 0! = 1 $$

$$ \large n! = n \cdot (n-1)!, \quad n \geq 1 $$

 

Dette kan skrives som en algoritme i pseudokode:

 

function factorial(n):
    if n = 0:
        return 1        // basis
    else:
        return n * factorial(n - 1)   // rekursivt skridt

 

 

Algoritmen stopper når \( \large n = 0 \), ellers kalder den sig selv med et mindre tal. Til sidst foldes alle kald tilbage til resultatet.

 

 

Eksempel: Maksimum i en liste

Vi kan også definere en algoritme rekursivt for at finde det største tal i en liste:

 

  • Basis: Hvis listen kun har ét element, er dette element maksimum.
  • Rekursivt skridt: Sammenlign det første element med maksimum i resten af listen.

 

 

function max(list):
    if list has length 1:
        return list[0]            // basis
    else:
        m = max(rest of list)     // rekursivt skridt
        return the larger of list[0] and m

 

 

Eksempel i praksis

 

Hvis vi har listen \( \large [7, 2, 9, 4] \):

max([7,2,9,4])

= larger of 7 and max([2,9,4])

= larger of 7 and larger of 2 and max([9,4])

= larger of 7 and larger of 2 and larger of 9 and max([4])

= larger of 7 and larger of 2 and larger of 9 and 4

= larger of 7 and larger of 2 and 9

= larger of 7 and 9

= 9

 

 

Opsummering

En rekursiv algoritme oversætter idéen bag en rekursiv definition til kode. Først angives et basis-tilfælde, hvor algoritmen stopper. Derefter beskrives et rekursivt skridt, hvor algoritmen kalder sig selv på et enklere problem. Dette mønster går igen i mange kendte algoritmer, som sortering, søgning og behandling af datastrukturer.