Example solutions for script 08_functions

Exercise 4.1

def collatz(n):
    count = 0
    print(n)
    while n != 1:
        if n % 2 == 0:
            n = n // 2
        else:
            n = 3 * n + 1
        print(n)
        count += 1
    return count

iterations = collatz(42)
print("needed", iterations, "iterations")
42
21
64
32
16
8
4
2
1
needed 8 iterations

Exercise 5.2 + 5.3

def maximum(li):
    if li == []:
        return None
    max_so_far = li[0]
    for i in range(1, len(li)):
        value = li[i]
        if value > max_so_far:
            max_so_far = value
    return max_so_far

print(maximum([]))
print(maximum([1]))
print(maximum([1, 2, 3]))
print(maximum([3, 2, 1]))
None
1
3
3

We can use slicing of lists for making the code shorter, but also make it more expressive:

def maximum(li):
    if li == []:
        return None
    max_so_far = li[0]
    for value in li[1:]:
        if value > max_so_far:
            max_so_far = value
    return max_so_far

print(maximum([]))
print(maximum([1]))
print(maximum([1, 2, 3]))
print(maximum([3, 2, 1]))
None
1
3
3

Exercise 5.4

import math

def std_dev(li):
    n = len(li)
    if n == 0:
        return None
    elif n == 1:
        return 0.0
    avg = sum(li) / n
    deviations = 0.0
    for number in li:
        deviations += (number - avg) ** 2
    std_dev = math.sqrt(deviations / (n - 1))
    return std_dev

print(std_dev([]))
print(std_dev([1]))
print(std_dev([1,1,1]))
print(std_dev([1,2,3]))
None
0.0
0.0
1.0