Funktionen schreibt man wie Variablennamen nach Konvention komplett klein.
Variablennamen müssen aussagekäftig sein, einbuchstabige Namen sind das nicht, und l hat zusätzlich noch das Problem, dass man es als 1 oder I lesen kann.
Wenn man Variablen einen Dummy-Wert zuweisen muß, damit eine while-Schleife losläuft, dann hat man eigentlich eine Schleife, bei der die Bedingung am Ende per if am Ende geprüft wird. Strings setzt man nicht per + zusammen, sondern nutzt Formatstrings.
; ist überflüssig.
i kann niemals kleiner 0 werden.
Kommen wir also bei diesem Code raus:
Code: Alles auswählen
def count_ones(numbers):
i = len(numbers) // 2
schrittgroesse = i // 2
while True:
print(f"s: {i}")
elem = numbers[i]
if elem == 1:
break
i_vorher = i
i += schrittgroesse
schrittgroesse //= 2
if i == i_vorher:
break
while i >= 0 and numbers[i] == 1:
i -= 1
i += 1
if i >= len(numbers) or numbers[i] == 0:
return 0
else:
return len(numbers) - i
Das i_vorher kann man auch einfach eliminieren, da das ja direkt mit der Schrittgroesse korrelliert:
Code: Alles auswählen
def count_ones(numbers):
i = len(numbers) // 2
schrittgroesse = i
while schrittgroesse != 0:
schrittgroesse //= 2
print(f"s: {i}")
elem = numbers[i]
if elem == 1:
break
i += schrittgroesse
while i >= 0 and numbers[i] == 1:
i -= 1
i += 1
if i < 0 or i >= len(l) or l[i] == 0:
return 0
else:
return len(l) - i
Der Code ist sehr ineffizient, wenn Du mehr als die Hälfte 1en in Deiner Liste hast.
Und der Code ist falsch, wenn die Länge der Liste nicht gerade eine Zweierpotenz ist.