Några extra övningar på rekursion



 Skriv en funktion maxv = rec_max(v), som använder rekursion för att hitta största värdet i vektorn v.



Skriv en funktion M = build_matrix(n) som med rekursion skapar en matris enligt följande exempel (det är OK om build_matrix i sig inte är rekursiv utan bara anropar en rekursiv rutin):

>> build_matrix(1)
ans =
     1
>> build_matrix(2)
ans =
     2     2     2
     2     1     2
     2     2     2
>> build_matrix(3)
ans =
     3     3     3     3     3
     3     2     2     2     3
     3     2     1     2     3
     3     2     2     2     3
     3     3     3     3     3
>> build_matrix(4)
ans =
     4     4     4     4     4     4     4
     4     3     3     3     3     3     4
     4     3     2     2     2     3     4
     4     3     2     1     2     3     4
     4     3     2     2     2     3     4
     4     3     3     3     3     3     4
     4     4     4     4     4     4     4


Skriv en rutin, pascal_main(n), som skriver ut de n första raderna i Pascals triangel. Det kan se ut så här:

>> pascal_main(7)
     1
     1     1
     1     2     1
     1     3     3     1
     1     4     6     4     1
     1     5    10    10     5     1
     1     6    15    20    15     6     1

I min lösning anropar pascal_main funktionen pascal, som är rekursiv.

Rita ett H-träd. Här är de första stegen, Htree(0), Htree(1), Htree(2).





Det första trädet ritas som ett H med sidlängden ett. Man ritar sedan fyra träd av halva storleken etc. Här ett träd med fler nivåer:






Skapa en variant av Kochkurvan, koch_rect.m, där vi har rektanglar istället för liksidiga trianglar. Så här kan de tre första stegen se ut för en rät linje:

square1
square2
square3

Notera att jag bygger ut rektanglarna med höjden en halv, annars kommer de att gå emot varandra.
Startar man med enhetskvadraten får man följande bild efter sex rekursionssteg (jag har infört rekursionssteg istället för normen, eftersom linjesegmenten kan ha olika längd):

square6



Rita Sierpinskis triangel. Jag gör inte som i Wikipedia-artikeln. Här är det första fyra stegen.






och här efter ytterligare några steg. I bilden till höger använder jag kommandot fill, som fyller polygoner, istället för plot-kommandot:





Programmen heter sierp_main.m (resp. sierp_col.m) de är inte vektoriserade. Testa också sierp_col_3d. Rotera plotten!

Åttadamsproblemet. Uppgiften består i att placera åtta damer på ett schackbräde (en 8x8-matris) så att ingen dam kan slå en annan dam. En dam kan slå pjäser i samma rad, i samma kolonn och diagonalt. Så här kan en lösning se ut (damerna är markerade med röda prickar):



























































Gör en rekursiv lösning. Programmet heter queen8.m. Om du vill kan du skriva ett program som kan placera ut n damer i en n x n-matris (det är inte mycket svårare).



Man kan ibland använda fraktaler i datorgrafik för att rita träd etc. Här ett träd som jag har gjort med ett sk Lindenmayersystem.

L-system

Du kan köra programmet lsyst.m (man får inte samma träd varje gång eftersom jag har lagt in lite slumpriktningar). Programmet är dock inte rekursivt och jag har bara tagit med det för att det är lite kul.