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