Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.139.81.58] |
|
Сообщ.
#1
,
|
|
|
Как можно найти количество елементов одномерного массива которые меньше среднего арифметического этого массива? Условие: реализировать за 1 проход
|
Сообщ.
#2
,
|
|
|
Думаю, что нельзя это сделать. Такое рассуждение:
1.Пусть среднее равно нулю. Тогда надо посчитать кол-во отрицательных. Это делается за 1 проход. 2.Пусть теперь менять будем только последний элемент, так чтобы среднее было другое. Тогда надо посчитать кол-во элементов меньших другого числа M. Это делается за 1 проход для числа M. 3.Получаем, что, просто шагая по массиву, вычисляя среднее, нужно принимать решение считать или нет вот этот конкретный элемент. Но итоговое M неизвестно, поэтому ничего не получится. |
Сообщ.
#3
,
|
|
|
Пускай мастера программирования забросают меня шапками, но я считаю что рекурсия ето не цикл
Вот мой рекурсивный вариант 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. |
Сообщ.
#4
,
|
|
|
Цитата Aleksandr H. @ но я считаю что рекурсия ето не цикл И ты ошибаешься. |
Сообщ.
#5
,
|
|
|
Цитата Aleksandr H. @ Как можно найти количество елементов одномерного массива которые меньше среднего арифметического этого массива? Условие: реализировать за 1 проход Никак. |
Сообщ.
#6
,
|
|
|
Тупой вариант - рекурсия с побочным эффектом. Пишу для массивов [0..X] длиной
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; Проход по массиву один, но возврат из рекурсии использует накопленные данные. |