Løsningsforslag til utvalgte oppgaver i kapittel 3#
Oppgave 3.2#
L = [2, 4, 5, 3, 2, 7, 3, 9]
L.sort() # Sorterer listen i stigende rekkefølge. Denne forandrer listen.
t = L[-2] # Henter ut nest siste element i listen.
print(t)
7
Oppgave 3.6#
H = [0]*51 # Lager en liste med 51 nuller. Det første elementet svarer til 0 trinn, det andre til 1 trinn osv.
H[1] = 1 # Det er 1 måte å hoppe opp 1 trinn på.
for n in range(2, 51): # Itererer over alle trinn fra 2 til 50.
H[n] = H[n-1] + H[n-2] # H[n] er lik antall måter å hoppe opp n trinn på.
print(H)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 7778742049, 12586269025]
Vi kunne også laget et program som definerer en funksjon rekursivt:
def H(n):
if n == 1:
return 1
elif n == 2:
return 2
else:
return H(n-1)+H(n-2)
Dette programmet vil få problemer når n blir stor (for eksempel når n = 50). Dette kommer av at den må regne ut de ulike verdiene for H(n) flere ganger for å trokle seg opp til n = 50. Dette kan vi unngå ved å lagre de ulike verdiene i en liste i minnet, slik at vi slipper å regne ut de samme verdiene flere ganger.
def mem(f):
memory = {}
def inner_function(x):
if x not in memory:
memory[x] = f(x)
return memory[x]
else:
return memory[x]
return inner_function
# "Dekorerer" funksjonen H med funksjonen mem:
@mem
def H(n):
if n == 1:
return 1
elif n == 2:
return 2
else:
return H(n-1)+H(n-2)
H(50)
20365011074
I koden ovenfor har vi laget en funksjon som heter mem(f). Den tar vare på verdiene som funksjonen f gir for ulike argumenter. Denne funksjonen kan vi bruke til å lage en ny funksjon som heter H(n). Denne funksjonen vil da huske verdiene til H(n) for ulike n, slik at vi slipper å regne ut de samme verdiene flere ganger.
Vi setter sammen disse to funksjonenen. Vi kan nå regne ut de 50 første verdiene i følgen H(n) ved å skrive:
for n in range(1,51):
print(H(n))
Oppgave 3.9#
# b)
B = 120000 # Startbeløp
vekstfaktor = 1.03
x = [0]*61 # Lager en liste med 61 nuller. Det første elementet svarer til 0 år, det andre til 1 år osv.
x[0] = B # Setter startbeløpet til 0 år
for n in range(1, 61): # Itererer over alle år fra 1 til 60.
x[n] = x[n-1]*vekstfaktor - 4000 # Beregner beløpet etter n år.
print(f"Det er {x[15]:.2f} kroner etter 15 år.")
Det er 112560.43 kroner etter 15 år.
# c)
i = 0
while x[i] > 100000:
i += 1 # Øker i med 1
print(f"Etter {i-1} år er det {x[i-1]:.2f} kroner igjen.")
print(f"Etter {i} år er det {x[i]:.2f} kroner igjen.")
Etter 30 år er det 100969.83 kroner igjen.
Etter 31 år er det 99998.93 kroner igjen.
Oppgave 3.12#
from math import sqrt
a, b = 4, 2*sqrt(2) # Startverdiene for a og b
N = 1000 # Antall iterasjoner
for n in range(N):
a = (2*a*b)/(a+b) # Oppdaterer a
b = sqrt(a*b) # Oppdaterer b. Merk at vi bruker den oppdaterte verdien av a.
print(f"Pi er ca. {a:.10f}")
Pi er ca. 3.1415926536