Följande uppgift är från en programmeringskurs på Uppsala universitet:
Skriv en funktion bytintill(li) som går igenom en lista li . Om två intilliggande tal, li[k] och li[k+1] ligger i minskande ordning, dvs li[k] > li[k+1], ska dessa två tal byta plats. Detta ska göras för alla k i tur och ordning. Testa funktionen noga och motivera att du har testat tillräckliga fall. Skriv en funktion bubblesort() som anropar bytintill() upprepade gånger tills inga mer byten sker. OBS: att bytintill() byter plats på två tal är en sidoeffekt eftersom listan förändras. Listan behöver alltså inte skickas som returvärde. Däremot måste ju bubblesort() på något sätt få reda på om byte skett. Ett sätt är att från bytintill() returnera ett sanningsvärde som anger detta. Testa funktionen med en testfunktion!
Jag har försökt att skriva en funktion bytintill med en for-loop som endast byter plats på två element åt gången. Det boolska-värdet är False initiellt och ändras till True om byten sker.
Därefter har jag gjort en funktion bubblesort som anropar bytintill så länge byten sker:
def task3_bytintill(the_list):
swap = False
for i in range(len(the_list)-1):
if the_list[i] > the_list[i+1]:
temp = the_list[i]
the_list[i] = the_list[i+1]
the_list[i+1] = temp
swap = True
return swap
break
def task3_bubblesort():
while test_task3 == True:
return(test_task3, "the list is being sorted...")
else:
return(test_task3, "the list is sorted")
test_task3 = task3_bytintill([1,5,3,2])
print( task3_bubblesort())
Jag har försökt att göra det här med en generell lösning där man tilldelar en variabel, test, funktionen som returnerar något och sedan printar det. När jag väl kör koden så får jag resultatet: (True, 'the list is being sorted...')
Vad behöver jag göra för att anropa bytintill med bubblesort så många gånger det behövs och sedan returnera den initiala listan, strängen "the list is being sorted...." och listan efter bytet. Efter det sista bytet bör det returnera "the list is sorted", [listan].
T.ex. en korrekt exekvering:
([1,9,7,5], 'the list is being sorted...', [1,7,9,5])
([1,7,9,5], 'the list is being sorted...', [1,7,5,9])
([1,7,5,9], 'the list is being sorted...', [1,5,7,9])
('the list is sorted: ', [1,5,7,9]
Det jag har problem med är att nå lokala variabler i funktioner. Jag skulle bli tacksam om någon kunde visa hur.