x <= 100
, eli silmukka jatkuu niin kauan
kuin x
on enintään 100
:
x = 1 while x <= 100: print(x) x *= 2
Ohjelman tulostus on seuraava:
1 2 4 8 16 32 64Kiinnostava piirre while-silmukassa on, että emme tiedä välttämättä etukäteen, montako kertaa silmukassa oleva koodi suoritetaan. Itse asiassa emme tiedä ehkä edes sitä, päättyykö silmukka milloinkaan.
n
.
Jos n
on parillinen, algoritmi jakaa sen kahdella,
ja muuten algoritmi kertoo sen kolmella ja lisää yhden.
Algoritmi toistaa samaa silmukassa, kunnes n
on 1.
Esimerkiksi jos alkuarvo n
on 12,
algoritmi käy läpi luvut 12, 6, 3, 10, 5, 16, 8, 4, 2 ja 1.
Voimme toteuttaa Collatzin algoritmin seuraavasti:
print(n) while n != 1: if n%2 == 0: n = n//2 else: n = 3*n+1 print(n)
Huomaa, että käytämme jakolaskussa merkintää //
tavallisen /
sijasta, jotta tulos on kokonaisluku
eikä siihen tule desimaaliosaa.
Esimerkiksi jos n
on 12,
ohjelman tulostus on seuraava:
12 6 3 10 5 16 8 4 2 1
Kysymys kuuluu: pysähtyykö Collatzin algoritmi kaikilla
n
:n arvoilla?
Algoritmi pysähtyy selvästi ainakin, kun n
on 12,
ja monella muullakin alkuarvolla,
mutta olisiko silti olemassa jokin suuri n
,
jolla algoritmi ei pysähdy? Kukaan ei tiedä asiaa.
Kirjoita ohjelma tähän:
1 1 2 2 3 8 4 3 5 6 6 9 7 17 8 4 9 20 10 7
Esimerkiksi alkuarvolla 7 algoritmi tulostaa 17 lukua. Tee ohjelma, joka tulostaa vastaavan luettelon alkuarvoille 1...100.
Kirjoita ohjelma tähän:
Kirjoita ohjelma tähän:
Esimerkiksi kun n on aluksi 10, suoritat 4 askelta: 10 → 5 → 4 → 2 → 1. Tee ohjelma, joka laskee, montako askelta suoritat, kun n on aluksi 123123.
Kirjoita ohjelma tähän:
Kirjoita ohjelma tähän:
Esimerkiksi kun n on 23, pienin siirtojen määrä on 5. Siirtosarja on 23 → 20 → 18 → 10 → 9 → 0. Mikä on pienin siirtojen määrä, kun n on 12345?
Kirjoita ohjelma tähän: