ViNyL schreef op maandag 11 mei 2020 @ 17:03:
Moet je de functie zelf na de remove niet opnieuw aanroepen?
code:
1
2
3
4
5
6
7
| def highest_even(list):
for number in list:
if (number % 2 != 0):
list.remove(number)
highest_even(list)
return max(list)
print(highest_even([5,4,8,9,17])) |
Dit levert bij mij 8 op
Interessante oplossing, maar dit is heftig in-efficiënt en levert op een gegeven moment een stack overflow op. Per niet-even element heb je een call en veel getallen worden onnodig dubbel gecheckt. Dit is echt een mooie om met een debugger eens per stap doorheen te lopen om te zien wat er nu echt gebeurd.
Op zich werkt dit ook, maar dit is ook niet efficiënt. Per element dat verwijderd moet worden moet je nogmaals op zoek naar dat element.
Ik zou me ook afvragen of je list eigenlijk wel zou mogen wijzigen bij zo'n functie, ik zou eigenlijk verwachten bij zo'n functie dat list niet gewijzigd wordt. Dus na
Python:
1
2
3
| l=[5,4,8,9,17]
print(highest_even(l))
l |
Zou ik verwachten dat je nog de oude l wil zien.
De genoemde
List comprehensions lijkt me de aangewezen oplossing.
spoiler:return max(x for x in list if x % 2 == 0)