下面的程序用来求一个数组的子序列和的最大值。 Input是数组, Length(Input)为数组长度,数组下标是zero based的。问是否存在逻辑错误?Procedure DiscoverSomethingInteresting(Input : Array Of Integer; Out x, y, z : Integer);
Var
    i, j, k : Integer;
    w       : Integer;
Begin
    z := -MaxInt;
    For i := 1 To Length(Input) Do
    Begin
        For j := 0 To Length(Input) - i Do
        Begin
            w := 0;
            For k := 0 To i - 1 Do
            Begin
                w := w + Input[j+k];
            End;
            If w > z Then
            Begin
                z       := w;
                x       := j;
                y       := j+i-1;
            End;
        End;
    End;
End;

解决方案 »

  1.   

    问题是你想实现什么功能,这样子谈逻辑没意义,
    当然你的循环并没有break,个人认为没有break的循环是可以用一条公式去替换的。。
      

  2.   

    好象没什么大的错误.i是子序列的长度,j是特定长度(i)的子序列的允许起始长度, k用来计算子序列中元素和的临时变量,看起来满清晰的。
    要说有什么不好的地方,就是重复计算的量太大了,比方说有2个子序列,大家都是从元素Input[0]开始,一个子序列(A)的长度是100,令一个子序列(B)的长度是101,LZ的程序需要进行200次求和才能知道A和B的元素和。而实际上,如果先求A的和,再在此基础上求B的和,则只需要101次计算就可以了。