Werken met R bij wiskunde: Controlestructuren
Voorwaardelijke herhaling
Vaak moeten in een algoritme een serie opdrachten herhaald uitvoeren: dit kan een vooraf vastgesteld aantal keren zijn (begrensde herhaling) of afhangen van een voorwaarde (voorwaardelijke herhaling). Beide vormen van herhaling zullen we tegenkomen, maar we beginnen met de tweede.
De algemene vorm van een voorwaardelijke herhaling (while
instructie) staat hieronder. Lees de toelichting voor meer uitleg:
Voorwaardelijke herhaling
while (voorwaarde) {
ingesprongen instructies voor als aan de voorwaarde voldaan is
}
> x <- 1.0 > y <- x/2 + 1/x > n <- 0 > while (abs(y-x)>0) { + x <- y + y <- x/2 + 1/x + n <- n + 1 + } > io <- sprintf("y = %.15f na %d stappen\n", y, n) > cat(io) y = 1.414213562373095 na 5 stappen
In de getoonde vorm van een voorwaardelijke herhaling vindt de evaluatie van de voorwaarde aan het begin van de herhalingslus plaats: in het Engels heet dit een pre-checked loop. Een alternatief is om eerst een serie instructies uit te voeren en dan een voorwaarde te controleren. Dit heet een post-checked loop. Het werkt als "verricht handelingen totdat aan een voorwaarde voldaan is''. Een post-checked loop kun je met een while
instructe simuleren. Bovenstaand voorbeeld kan er dan als volgt uitzien (merk op dat nu de teller n eindigt op 6 i.p.v. 5 in bovenstaande code).
> x <- 1.0 > n <- 0 > niet_klaar <- TRUE > while (niet_klaar) { + y <- x/2 + 1/x + n <- n + 1 + if (abs(x-y) == 0) { + niet_klaar <- FALSE + } else { + x <- y + } + } > io <- sprintf("y = %.15f na %d stappen\n", y, n) > cat(io) y = 1.414213562373095 na 6 stappen
Met de break
instructie kun je ook rechtstreeks uit de while
instructie springen en doorgaan met de instructies hierna. In onderstaand voorbeeld hebben we de stopvoorwaarde aangepast zodat deze rekentechnisch veiliger is, d.w.z. geen oneindige herhaling op kan leveren.
> x <- 1.0 > n <- 0 > epsilon <- 10^(-10) > while (TRUE) { + y <- x/2 + 1/x + n <- n + 1 + if (abs(x-y) < epsilon) { + break + } else { + x <- y + } + } > io <- sprintf("y = %.10f na %d stappen\n", y, n) > cat(io) y = 1.4142135624 na 5 stappen