На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
Дорогие друзья! Поздравляем вас с днём Победы!
msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
  
> Количество елементов меньше среднего арифметического , за один проход
    Как можно найти количество елементов одномерного массива которые меньше среднего арифметического этого массива? Условие: реализировать за 1 проход
      Думаю, что нельзя это сделать. Такое рассуждение:
      1.Пусть среднее равно нулю. Тогда надо посчитать кол-во отрицательных. Это делается за 1 проход.
      2.Пусть теперь менять будем только последний элемент, так чтобы среднее было другое. Тогда надо посчитать кол-во элементов меньших другого числа M. Это делается за 1 проход для числа M.
      3.Получаем, что, просто шагая по массиву, вычисляя среднее, нужно принимать решение считать или нет вот этот конкретный элемент. Но итоговое M неизвестно, поэтому ничего не получится.
        Пускай мастера программирования забросают меня шапками, но я считаю что рекурсия ето не цикл ;)
        Вот мой рекурсивный вариант
        ExpandedWrap disabled
          Const N = 10;
          var a : array [1..N] of integer;
              f,i,j,k,l,s:integer;
              avg:real;
           
          function ismnie(l:integer):integer;
              begin
                   if l>1 then
                      begin
                           if a[l] < avg then
                              ismnie := 1+ismnie(l-1)
                           else
                               ismnie := ismnie(l-1)
                      end
                      else
                      begin
                          if a[l] < avg then ismnie := 1 else ismnie := 0
                      end;
              end;
           
          begin
               f := 0;
               randomize;
               s:=0;
               for i := 1 to N do
                begin
                     a[i]:= random(10);
                     s:=s+a[i];
                     write(a[i]:3);
                end;
               writeln;
               avg:=s/N;
               writeln('avg : ',avg:3:3);
               For i := 1 to N do
                if a[i]<avg then inc(j);
               writeln('Результат с помощью дополнительного прохода : ',j);
               writeln;
               writeln('Рекурсивный результат : ',ismnie(N));
               readln;
          end.
          Цитата Aleksandr H. @
          но я считаю что рекурсия ето не цикл

          И ты ошибаешься.
            Цитата Aleksandr H. @
            Как можно найти количество елементов одномерного массива которые меньше среднего арифметического этого массива? Условие: реализировать за 1 проход

            Никак.
              Тупой вариант - рекурсия с побочным эффектом. Пишу для массивов [0..X] длиной
              ExpandedWrap disabled
                type TArray = array of extended; {массив C-style}
                var sideeffect_average:extended;
                function searchArray(var a:TArray,index:integer,len:integer,average:extended):integer;
                var theElement:extended;
                var accmins:integer;
                begin
                  if index=0 then begin
                    if len=0 then begin
                      searchArray:=0;
                      exit;
                    end;
                  end;
                  if index=len then begin
                    sideeffect_average= average/len;
                    searchArray:=0;
                    exit;
                  end;
                  theElement=a[index];
                  accmins:=searchArray(a,index+1,len,average+theElement);
                  if theElement<sideeffect_average then inc(accmins);
                  searchArray:=accmins;
                end;

              Проход по массиву один, но возврат из рекурсии использует накопленные данные.
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0291 ]   [ 15 queries used ]   [ Generated: 12.05.24, 14:59 GMT ]