Basis: algoritmen¶
De nacht van het nijlpaard¶
Opdracht: De nacht van het nijlpaard
Stap 1: far_enough(a, b, distance)¶
def far_enough(a, b, distance):
"""Geeft True als plaats b minstens distance verder ligt dan plaats a."""
return b - a >= distance
assert far_enough(1, 3, 2) == True
assert far_enough(2, 3, 2) == False
assert far_enough(3, 3, 1) == False
assert far_enough(5, 10, 5) == True
Stap 2: drop_too_close(place, places, distance)¶
Zodra één plaats ver genoeg ligt, stopt de recursie: de plaatsen daarna liggen nog verder weg.
def drop_too_close(place, places, distance):
"""Geeft places zonder de plaatsen aan het begin die te dicht bij place liggen."""
if places == []: # basisgeval
return []
elif far_enough(place, places[0], distance): # basisgeval: ver genoeg
return places
else: # recursief geval: de eerste plaats ligt te dichtbij
return drop_too_close(place, places[1:], distance)
assert drop_too_close(1, [3, 7], 2) == [3, 7]
assert drop_too_close(3, [3, 5, 8], 4) == [8]
assert drop_too_close(1, [3, 5, 10, 12], 4) == [5, 10, 12]
assert drop_too_close(5, [6, 7], 3) == []
assert drop_too_close(5, [], 2) == []
Stap 3: hippo_dinner(distance, places)¶
def hippo_dinner(distance, places):
"""Geeft hoeveel nijlpaarden er hoogstens mee-eten op de plaatsen in places."""
if places == []: # basisgeval
return 0
first = places[0]
rest = places[1:]
use_it = 1 + hippo_dinner(distance, drop_too_close(first, rest, distance))
lose_it = hippo_dinner(distance, rest)
return max(use_it, lose_it)
assert hippo_dinner(1, [2, 3, 3]) == 2
assert hippo_dinner(2, [1, 3, 7]) == 3
assert hippo_dinner(4, [1, 3, 5, 10, 12]) == 3
assert hippo_dinner(3, [4]) == 1
assert hippo_dinner(3, []) == 0