Att lära dig från uppgifterna
- Hur man skriver rekursiva funktioner.
OBS! Alla uppgifter ska lösas rekursivt! Du får alltså inte använda
for
- eller while
-loopar.
Godkänt
För att få godkänt krävs 100 poäng. Försök dock att lösa alla uppgifter då inte alla fel upptäcks av rättningsskriptet men om ni har lite marginal kan ni kanske bli godkända även om assistenten som rättar hittar något sådant fel.
Uppgift 3.3.1 (10p)
Skriv en funktion fac_rec(n)
som tar in ett tal och beräknar
$n!=n\times (n-1)\times (n-2) \times … \times 1$.
Uppgift 3.3.2 (10p)
Skriv en funktion fib(n)
som returnerar fibonaccitalet för position n
.
Om du är obekant med fibonaccital kan du läsa mer om det på
wikipedia.
Uppgift 3.3.3 (10p)
Skriv en funktion pascal(row, col)
som returnerar talet på rad row
och
column col
i pascals triangel. Du får inte använda den uttryckliga formeln för
binomialkoefficienter för att lösa uppgiften.
Du kan läsa mer om pascals triangel på wikipedia.
Tips 1: Börja med att sätta upp villkor för vilka värden på
row
och col
som funktionen ska returnera 1, dvs för vilka värden på row
och col
är värdet högst upp, eller på en ytterkant.
Tips 2: Värdet är högst upp i triangeln när rad 0 efterfrågas. Värdet är på vänsterkanten när kolumnen är 0 och på högerkanten när rad och kolumn är samma tal.
Tips 3: Värdena som inte är på en ytterkant är summan av värdena ovanför. Du kan använda rekursiva anrop med modifierade rad och kolumnvärden för få dessa två värden.
Tips 4: För alla värden i Pascals triangel som inte är högst upp, eller på en ytterkant gäller $pascal(row, col) = pascal(row-1, col-1) + pascal(row-1, col)$
Uppgift 3.3.4 (10p)
Skriv en funktion keep_if_even(lst)
vars argument lst
är en lista med
heltal. Funktionen returnerar en ny lista med de heltal i lst
som är jämna.
Exempel:
|
|
Uppgift 3.3.5 (10p)
Skriv en funktion reverse_rec(lst)
som tar en lista som inargument och
returnerar en ny lista i omvänd ordning. Du ska inte undersöka
listor-i-listor.
Exempel:
|
|
Exempel:
|
|
Uppgift 3.3.6 (15p)
Skriv en funktion keep_if_even_all(lst)
som gör som keep_if_even
i uppgift
3.3.4, men den undersöker också listor-i-listor. Om en lista bara innehåller
udda tal ska den tomma listan sparas.
Exempel:
|
|
Exempel:
|
|
Uppgift 3.3.7 (15p)
Skriv en funktion reverse_rec_all(lst)
som gör som reverse_rec
men den
undersöker också listor-i-listor.
Exempel:
|
|
Exempel:
|
|
Uppgift 3.3.8 (15p)
Skriv en funktion is_in_list(lst, element)
som returnerar True
om element
finns i lst
, annars returnerar funktionen False
. Funktionen ska undersöka
listor-i-listor.
Exempel:
|
|
Exempel:
|
|
Uppgift 3.3.9 (15p)
Skriv en funktion count_all(lst)
som returnerar antalet element som finns i
lst
. Funktionen ska undersöka listor-i-listor.
Exempel:
|
|
Exempel:
|
|
Uppgift 3.3.10 (20p)
Skriv en funktion subst_all(lst, element, new_value)
som returnerar en ny
lista där alla förekomster av element
har byts ut mot new_value
. Funktionen
ska undersöka listor-i-listor.
Exempel:
|
|
Exempel:
|
|
Uppgift 3.3.11 (15p)
Skriv funktionen multiply(factor1, factor2)
som utför multiplikationen genom att addera factor1
till factor1
, factor2
antal gånger med hjälp av rekursion.
Exempel:
|
|
Uppgift 3.3.E1
Extra uppgift (ingår ej bland rättade uppgifter). Bra övning inför Del 2 på tentan.
Skriv en funktion linear_serch(key, seq)
som söker efter key
(ett tecken
eller ett listelement) i sekvensen seq
(en sträng eller rak lista) och
returnerar positionen. Om key
ej finns i sekvensen så ska -1 returneras.
Exempel:
|
|
Tips 1
När man gör en rekursiv lösning och vill använda ett index behöver man införa
det som ett argument. linear_search
kan därför definieras som:
|
|
linear_search_hlp(key, seq, index)
är en ‘hjälpfunktionen’ till
linear_search(key, seq)
som innehåller den faktiska koden.
Tips 2
Ett alternativ är att använda argument med default-värde (gås
igenom på Föreläsning 4.1): linear_search(key, seq, index=0)
Uppgift 3.3.E2
Extra uppgift (ingår ej bland rättade uppgifter). Bra övning inför Del 2 på tentan.
Linjär sökning är ett ineffektivt sätt att söka. Ett betydligt snabbare sätt är att gör binär sökning. Binärsökning söker igenom en sorterad lista. Binärsökning börjar med att jämföra elementet i mitten av listan med det sökta värdet. Om det sökta värdet är lika med elementet i mitten av listan, returneras dess position i listan. Om det sökta värdet är mindre eller större än elementet i mitten av listan, så fortsätter sökningen i den lägre respektive högre halvan av listan, rekursivt
Skriv en funktion binary_search(key, sorted_lst)
som söker efter key
i den
sorterade listan sorted_lst
och returnerar positionen för key. Om key
ej
finns i sekvensen så ska -1 returneras.
Exempel:
|
|
Tips: Använd två extra argument för low
resp high
för att
representera index för start och slut på det listsegment du undersöker. Initialt
är low = 0 och high = len(seq)-1
Uppgift 3.3.E3
Extra uppgift (ingår ej bland rättade uppgifter). Bra övning inför Del 2 på tentan.
Skriv rekursiva versioner av funktionerna insert_at_asc_place(values, new_value)
och sort_asc(values)
från uppgift 2.3.10-11. Namnge dem
insert(lst, new_value)
resp insertion_sort(lst)
Exempel:
|
|
Uppgift 3.3.E4
Extra uppgift (ingår ej bland rättade uppgifter). Bra övning inför Del 2 på tentan.
Ett effektivare sätt att sortera listor på är med mergesort som är av typen “söndra och härska”. Om en lista har längden 1 är den sorterad och kan returneras, annars delas listan i två delar som sorteras och sedan sätts ihop.
Skriv de rekursiva funktionerna merge_sort(lst)
och merge(sorted_lst1, sorted_lst2)
där merge()
tar två sorterade listor och sätter samman dem
till en sorterad lista.
Exempel:
|
|
Sidansvarig: Johan Falkenjack
Senast uppdaterad: 0001-01-01