Улучшить функцию

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
maks
новенький
Сообщения: 18
Зарегистрирован: 20.12.2007 20:08:00
Откуда: Вильнюс

Улучшить функцию

Сообщение maks »

Первичные данные целых чисел массив, элементы в массиве упорядочены возрастающем порядке. Функция Daug читает элементы и определяет число который больше всех в этом массиве находится. Если есть числа которые одинаковое число раз повторяются то в ответе любое должно быть.
Задание простое и логичное.

Код: Выделить всё

const m = ...;
      n = ...;
type masyvas = array [m..n] of integer;
function Daug (a : masyvas) : integer;
var i, r,       
    k,         
    sk : integer;
begin
  r := a[m];
  sk := 1; k := 1;
  for i := m + 1 to n do
    begin
      if a[i] = a[i – 1]
        then begin
               k := k + 1;
               if k > sk
                 then begin
                        r := a[i];
                        sk := k
                      end
             end
        else k := 1
    end;
  daug := r
end;

Henry Ledgard писал что этот алгоритм пробовали улучшить сто людей но некто лучше нечего не придумал.
Но вы сто первый.
Попробуйте написать решение одной переменной, и одной управляемой структурой меньше.
Что это за структура управляемой?
Я вот изменил не много не знаю правильно или нет.

Код: Выделить всё

const m = ...;
      n = ...;
type masyvas = array [m..n] of integer;
function Daug (a : masyvas) : integer;
var i,       
    k,         
    sk : integer;
begin
  Daug := a[m];
  sk := 1; k := 1;
  for i := m + 1 to n do
      if a[i] = a[i – 1]
        then begin
               k := k + 1;
               if k > sk
                 then begin
                        Daug := a[i];
                        sk := k
                      end
             end
        else k := 1
end;

а как одной управляемой структурой меньше сделать я не знаю не могу придумать. Может кто то поможет ?
у меня была идея сделать рекурсией но я с рекурсией очень плохо дружу а других идей нету помогите пожалста
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

т.к. числа расположены попорядку, то и считать их не нужно (переменная k - лишняя).
соответсвенно if k > sk тоже смысла не имеет.

Код: Выделить всё

const m = ...;
      n = ...;
type masyvas = array [m..n] of integer;

function Daug(a : masyvas): integer;
var
  i, j, sk : Integer;
begin
  j := 1;
  sk := 0;
  Doug := a[m];
  for i := m + 1 to n do
    if (a[i] <> a[i-1]) and (i-j > sk) then begin
      sk := i-j;
      Doug := a[i-1];
      j := i;
    end;
end;


как одно из правил программирования: не храните то, что можно легко посчитать
Наш декан, в своё время (да и сейчас), "мучает" студентов, подобными заданиями ))
maks
новенький
Сообщения: 18
Зарегистрирован: 20.12.2007 20:08:00
Откуда: Вильнюс

Сообщение maks »

ясно спасибо
Ответить