下面的程序用来求一个数组的子序列和的最大值。 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;
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;
当然你的循环并没有break,个人认为没有break的循环是可以用一条公式去替换的。。
要说有什么不好的地方,就是重复计算的量太大了,比方说有2个子序列,大家都是从元素Input[0]开始,一个子序列(A)的长度是100,令一个子序列(B)的长度是101,LZ的程序需要进行200次求和才能知道A和B的元素和。而实际上,如果先求A的和,再在此基础上求B的和,则只需要101次计算就可以了。