Vraagstelling Bepaal of N een macht van 2 is. (16 = 2**4) Strategie Vervang constante N door variabele q Formele probleemspecificatie pre: N >= 0 post: IsMachtVanTwee = (Ei:0<=i<=N:2**i=N) * Eindrelatie R: IsMachtVanTwee = (Ei:0<=i<=N:2**i=N) * Invariant IsMachtVanTwee = (Ei:0<=i<=q:2**i=N) ^ -1<=q<=N * Stopcriterium q != N Initialisatie q = -1; // leeg domein IsMachtVanTwee = false; // waarde bij leeg domein Stap richting stopcriterium q++; Actie herstel invariant IsMachtVanTwee = IsMachtVanTwee || (Ei:i=q:2**i=N) Algoritme public boolean IsMachtVanTwee(int N){ int q = -1; boolean IsMachtVanTwee = false; while(q != N){ q++; IsMachtVanTwee = IsMachtVanTwee || Math.pow(2,q)==n; } return IsMachtVanTwee; } Optimalisatie Zodra IsMachtVanTwee de waarde true krijgt, zal IsMachtVanTwee niet meer wijzigen. Immers: true || Math.pow(2,q)==n <=> true Daarom kan de conditie van de repetitie worden versterkt tot: q != N && !IsMachtVanTwee Maar dan heeft IsMachtVanTwee = IsMachtVanTwee || Math.pow(2,q)==n; als preconditie: IsMachtVanTwee = false en omdat IsMachtVanTwee = false || Math.pow(2,q)==n; kan deze toekenning worden vereenvoudigd tot: IsMachtVanTwee = Math.pow(2,q)==n; public boolean IsMachtVanTwee(int N){ int q = -1; boolean IsMachtVanTwee = false; while(q != N && !IsMachtVanTwee){ q++; IsMachtVanTwee = Math.pow(2,q)==n; } return IsMachtVanTwee; }