Hvordan lærer man rekursion?

Når jeg holder eksamen i et kursus, kommer jeg altid til at overveje nye tilgangsvinkler til faget, for eksamen markerer ved sin blotte tilstedeværelse, at endnu et undervisningsforløb er slut. Da jeg i efteråret igen, efter et års pause, igen skulle være en af kursusholderne på kurset Programmeringsparadigmer, ved vores kandidatuddannelser i datalogi og software, begyndte jeg igen at overveje hvordan man kan undervise i begrebet rekursion. Rekursion er nemlig helt centralt for dette kursus. Og i disse dage, hvor jeg taler med de studerende om kurset ved mundtlig eksamen, dukker overvejelserne op til overfladen igen. Nogle gange virker det som om rekursion er et stedbarn på vores datalogiske uddannelser på Aalborg Universitet; emnet dukker op mange gange rundt omkring, men det det bliver formodentlig aldrig rigtig grundigt belyst.

Mange mennesker uden for datalogi og matematik kender rekursion fra naturfænomenet selvsimilaritet. Se bare dette romanesco-kålhoved:

Kålhovedet består af en masse mini-kålhoveder, der har samme form som det store kålhoved. Og mini-kålhovederne består af endnu mindre mikro-kålhoveder, der har samme form som mini-kålhovederne. Og så fremdeles.

Christian Rinderknecht, der er en fransk datalog, fik i 2014 publiceret en rigtig interessant oversigtsartikel om de mange forskellige overvejelser og tilgange, der er blevet gjort til at undervise i rekursion.

Det vil selvfølgelig føre alt for vidt at gentage artiklens hovedpointer her; de er mange. Især Rinderknechts redegørelse for undersøgelserne af hvordan børn, unge og voksne forstår rekursion gennem mentale modeller er interessante.

Men to af hans konklusioner slår mig. Den første er at kålhoved-eksemplet i sig har et problem: Det får det til at se ud som om rekursive strukturer er uendelige. Det er de jo ikke; kålhoveder er meget endelige størrelser; et kålhoved kan sagtens være i en stor gryde, et sted i kålhovedet er vi nede på molekyle-niveau, og et kålhoved-molekyle består selvfølgelig ikke af endnu mindre kålhoved-molekyler (faktisk stopper rekursionen jo længe før).

Den anden er at der faktisk er to måder at tænke på rekursion på. Den ene er den dynamiske/procedurelle, hvor man tænker på rekursion som “at kalde sig selv”. Den anden er den statiske/strukturelle, hvor man definerer rekursion strukturelt: At en rekursiv størrelse indeholder “en kopi af sig selv”. Når jeg tænker tilbage, er det nok aldrig lykkedes mig at gøre dette helt klart i min undervisning – men det er vigtigt at skelne og at gøre forbindelsen helt klar. I det sprog, jeg har undervist i, nemlig Haskell, dukker der både rekursive programmer op (og de er dynamiske) og rekursive data op (og de er statiske, Haskells svar på kålhovederne, de rekursive datatyper). Når man skal gennemvandre en statisk rekursiv struktur, f.eks. for at spise et kålhoved, skal man bruge en dynamisk rekursiv strategi, der passer til: Spis kålhovedet ved først at spise hvert af de små kålhoveder. Og så fremderes.

(Visited 28 times, 1 visits today)
Loading Facebook Comments ...

Skriv et svar