内部 FOR 循环后无法理解第 10 行指令

Can´t undertand 10th line instruction after inner FOR loop

我一直在学习 "Algorithms and Data Structures" N.Wirth。他用自己创造的语言编写算法代码:Oberon。我读完了这本书,但我对第 19 页用 Oberon 编码的算法有一个疑问:

PROCEDURE Power (VAR W: Texts.Writer; N: INTEGER);
    VAR i, k, r: INTEGER;
    d: ARRAY N OF INTEGER;
    BEGIN
        FOR k := 0 TO N-1 DO
            Texts.Write(W, "."); r := 0;
            FOR i := 0 TO k-1 DO
                r := 10*r + d[i]; d[i] := r DIV 2; r := r MOD 2;
                Texts.Write(W, CHR(d[i] + ORD("0")))
            END;
            d[k] := 5; Texts.Write(W, "5"); Texts.WriteLn(W)
        END
    END Power

The resulting output text for N = 10 is
.5
.25
.125
.0625
.03125
.015625
.0078125
.00390625
.001953125
.0009765625

我不明白第 10 行的指令 d[k] := 5; Texts.Write(W, "5"); Texts.WriteLn(W) 的作用:

1) 为什么你会 d[k] := 5?该程序已经打印了所有需要的输出 (d[0] to d[k-1])。

2) 你为什么要在那之后打印一个 5? (Texts.Write(W, "5"))

该计算利用了最后一位数字始终为五这一事实。

  1. 除非执行完毕,当r在内循环的最后一轮变成10*r + d[i]时,变量d[k]会在外循环的下一轮被读取
  2. 语句 Texts.Write(W, "5")Texts.Write(W, d[i]) 需要(略微)少的计算。