Iteration - Sm.luth.se
Iteration - Sm.luth.se
Iteration - Sm.luth.se
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
L U L E Å T E K N I S K A U N I V E R S I T ET<br />
INTRODUKTION TILL PROGRAMMERING<br />
S Y S T E M T E K N I K<br />
D 0 0 0 9 E<br />
Snurror kontra rekursion<br />
L U L E Å T E K N I S K A U N I V E R S I T ET<br />
INTRODUKTION TILL PROGRAMMERING<br />
S Y S T E M T E K N I K<br />
D 0 0 0 9 E<br />
Stackdiagram för countdown(3)<br />
Ob<strong>se</strong>rvation 1: Allt som kan uttryckas med en snurra<br />
kan också uttryckas med rekursion, men inte tvärtom<br />
Rekursion är alltså kraftfullare än snurror<br />
Ob<strong>se</strong>rvation 2: Enkla problem kan ofta uttryckas väldigt<br />
enkelt med snurror<br />
Ob<strong>se</strong>rvation 3: Svårare problem tenderar att uttryckas<br />
felaktigt med hjälp av snurror<br />
Ob<strong>se</strong>rvation 4: Snurror återanvänder minne varje varv,<br />
medan rekursion medför en ständigt växande stack<br />
Snurra:<br />
countdown<br />
n<br />
3<br />
2<br />
1<br />
0<br />
-toplevel-<br />
Rekursion:<br />
-toplevelcountdown<br />
countdown n 3<br />
n 2<br />
countdown n 1<br />
countdown n 0<br />
7<br />
8<br />
9<br />
L U L E Å T E K N I S K A U N I V E R S I T ET<br />
S Y S T E M T E K N I K<br />
Terminering<br />
INTRODUKTION TILL PROGRAMMERING<br />
D 0 0 0 9 E<br />
Hur vet man om while-snurrans test någonsin blir<br />
falskt, så att snurran stannar?<br />
Svar: det vet man inte generellt! Programmeraren måste<br />
övertyga sig om detta från fall till fall<br />
Oändlig snurra (provkör gärna):<br />
while True:<br />
pass<br />
Jämför med rekursion som aldrig når (eller saknar) sitt<br />
basfall<br />
Hur vet vi egentligen att countdown(n) terminerar<br />
(båda versionerna)? Hur är det med countdown(-1)?<br />
10<br />
L U L E Å T E K N I S K A U N I V E R S I T ET<br />
S Y S T E M T E K N I K<br />
Ett svårt fall<br />
INTRODUKTION TILL PROGRAMMERING<br />
D 0 0 0 9 E<br />
Terminerar denna funktion för alla positiva värden på<br />
n?<br />
def <strong>se</strong>quence(n):<br />
while n != 1:<br />
print n,<br />
if n%2 == 0:<br />
n = n/2<br />
el<strong>se</strong>:<br />
n = n*3+1<br />
Svar: både bevis och motbevis saknas!<br />
(Vanligen förekommande snurror är dock mycket<br />
enklare att resonera om!)<br />
L U L E Å T E K N I S K A U N I V E R S I T ET<br />
S Y S T E M T E K N I K<br />
INTRODUKTION TILL PROGRAMMERING<br />
D 0 0 0 9 E<br />
L U L E Å T E K N I S K A U N I V E R S I T ET<br />
S Y S T E M T E K N I K<br />
INTRODUKTION TILL PROGRAMMERING<br />
D 0 0 0 9 E<br />
Exempel<br />
Exempel<br />
11<br />
Utskrift av logaritmtabell:<br />
x = 1.0<br />
while x < 10.0:<br />
print x, '\t', math.log(x, 2)<br />
x = x + 1.0<br />
Resultat:<br />
1.0 0.0<br />
2.0 1.0<br />
3.0 1.58496250072<br />
4.0 2.0<br />
5.0 2.32192809489<br />
6.0 2.58496250072<br />
7.0 2.80735492206<br />
8.0 3.0<br />
9.0 3.16992500144<br />
Strängen '\t' är en s k<br />
escape-<strong>se</strong>kvens som<br />
(i detta fall) betyder<br />
tabulator-tecknet<br />
Andra vanliga tecken:<br />
\n nyrad<br />
\r vagnretur<br />
\v vertikal tab<br />
\\ \ (på riktigt!)<br />
\xnn ASCII nn<br />
12<br />
En variant som bara stegar igenom 2-poten<strong>se</strong>r:<br />
x = 1.0<br />
while x < 100.0:<br />
print x, '\t', math.log(x, 2)<br />
x = x * 2.0<br />
Resultat:<br />
1.0 0.0<br />
2.0 1.0<br />
4.0 2.0<br />
8.0 3.0<br />
16.0 4.0<br />
32.0 5.0<br />
64.0 6.0<br />
2