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

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

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

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

Сообщение maks » 18.10.2009 14:06:10

Первичные данные целых чисел массив, элементы в массиве упорядочены возрастающем порядке. Функция 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;

а как одной управляемой структурой меньше сделать я не знаю не могу придумать. Может кто то поможет ?
у меня была идея сделать рекурсией но я с рекурсией очень плохо дружу а других идей нету помогите пожалста
maks
новенький
 
Сообщения: 18
Зарегистрирован: 20.12.2007 21:08:00
Откуда: Вильнюс

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

Сообщение скалогрыз » 18.10.2009 20:35:46

т.к. числа расположены попорядку, то и считать их не нужно (переменная 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;


как одно из правил программирования: не храните то, что можно легко посчитать
Наш декан, в своё время (да и сейчас), "мучает" студентов, подобными заданиями ))
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение maks » 19.10.2009 19:30:01

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


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

Рейтинг@Mail.ru