47 lines
1.3 KiB
Text
47 lines
1.3 KiB
Text
$ include "seed7_05.s7i";
|
|
|
|
const func array integer: maxSubseq (in array integer: sequence) is func
|
|
result
|
|
var array integer: maxSequence is 0 times 0;
|
|
local
|
|
var integer: number is 0;
|
|
var integer: index is 0;
|
|
var integer: currentSum is 0;
|
|
var integer: currentStart is 1;
|
|
var integer: maxSum is 0;
|
|
var integer: startPos is 0;
|
|
var integer: endPos is 0;
|
|
begin
|
|
for number key index range sequence do
|
|
currentSum +:= number;
|
|
if currentSum < 0 then
|
|
currentStart := succ(index);
|
|
currentSum := 0;
|
|
elsif currentSum > maxSum then
|
|
maxSum := currentSum;
|
|
startPos := currentStart;
|
|
endPos := index;
|
|
end if;
|
|
end for;
|
|
if startPos <= endPos and startPos >= 1 and endPos >= 1 then
|
|
maxSequence := sequence[startPos .. endPos];
|
|
end if;
|
|
end func;
|
|
|
|
const proc: main is func
|
|
local
|
|
const array integer: a1 is [] (-1, -2, 3, 5, 6, -2, -1, 4, -4, 2, -1);
|
|
const array integer: a2 is [] (-1, -2, -3, -5, -6, -2, -1, -4, -4, -2, -1);
|
|
var integer: number is 0;
|
|
begin
|
|
write("Maximal subsequence:");
|
|
for number range maxSubseq(a1) do
|
|
write(" " <& number);
|
|
end for;
|
|
writeln;
|
|
write("Maximal subsequence:");
|
|
for number range maxSubseq(a2) do
|
|
write(" " <& number);
|
|
end for;
|
|
writeln;
|
|
end func;
|