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

时间:2018-10-16 23:12:39

标签: oberon

我一直在研究N.Wirth的“算法和数据结构”。他使用他创建的语言Oberon编码算法。我完成了这本书,但对以Oberon编码的第19页的算法有一个疑问:

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 个答案:

答案 0 :(得分:0)

计算利用了最后一个数字始终为5的事实。

  1. 除非执行完成,否则当d[k]在内部循环的最后一轮变为r时,变量10*r + d[i]将在外部循环的下一轮被读取
  2. Texts.Write(W, "5")相比,Texts.Write(W, d[i])语句所需的计算量(略)。