Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 10

Рекурсия. Среднее значение

25.09.2012, 19:15. Показов 1933. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста с задачей: Напишите рекурсивную функцию, которая находит среднее значение элементов массива, которые больше заданного числа n.

Вот что смог сделать...
в параметрах:
a - массив
m - число эл-тов в нем
n - задаваемое число
i - номер текущего эл-та
k - счетчик кол-ва чисел больших, чем n


C++
1
2
3
4
5
int sredsum(int *a,int m, int n,int i,int k){
if (i>=m) return 0;
if (a[i]>n) return a[i]+sredsum(a,m,n,i+1,k+1);
else return 0+sredsum(a,m,n,i+1,k);
}

Т.е я только считаю сумму, а вот как и где поделить на k - ума не приложу.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.09.2012, 19:15
Ответы с готовыми решениями:

Рекурсия. Среднее значение в двумрном массиве
Доброе время суток. Помогите пожалуйста с задачей: Напишите рекурсивную функцию, которая находит среднее арифметическое наибольшего и...

В одномерном массиве определить среднее значение всех элементов,значение которых превышает среднее значение
в произвольно заданном одномерном массиве определить среднее значение всех элементов,значение которых превышает среднее значение

Подскажите как добавить вычесленное среднее значение из подпрограммы 1, в подпрограмму 2, а то в подпрограмме 2 берет среднее значение = 0
void Count_avg(int n,knigizd* str, double Avg_all ) // Подпрограмма 1 { Avg_all = 0; // Вычесление среднее значение по...

12
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
25.09.2012, 19:31
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
 
float foo( int* beg, int* end, int n ) {
    static int count = 0, sum = 0;
 
    if (beg < end)
        foo(beg + 1, end, n);
 
    if (*beg > n) {
        ++count;
        sum += *beg;
    }
 
    return (count > 0) ? ((float)sum / (float) count) : 0.;
}
 
int main() {
 
    int a[] = {1, 2, 3, 4, 4, 2, 1};
 
    fprintf(stdout, "%f == %f\n", (11. / 3.), foo(&a[0], &a[6], 2) );
    return 0;
}
0
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 10
25.09.2012, 20:16  [ТС]
разве эта функция пройдет дальше первой проверки?
она ведь просто переходит каждый раз к следующему элементу, пока может
0
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
25.09.2012, 20:25
У вас тут два числа, которые нужно вернуть из рекурсии - промежуточная сумма и количество найденных элементов. Одно можно вернуть ретурном (как вы и делаете), а другое можно передавать по ссылке. Т.е. int& k
А затем уже в main делить результат работы на это k.

C++
1
2
3
4
5
6
7
8
9
10
int sredsum(int *a,int m, int n,int i,int& k){/*...*/}
 
int main()
{
//...
   int k = 0;
   int sum = sredsum(..., k);
   double answer = k ? (double)sum/k : 0.0;
//...
}
1
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
25.09.2012, 20:26
Renox, а проверить?
0
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
25.09.2012, 20:30
Цитата Сообщение от Renox Посмотреть сообщение
разве эта функция пройдет дальше первой проверки?
она ведь просто переходит каждый раз к следующему элементу, пока может
Она работает верно. За счет
static int count = 0, sum = 0;
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
25.09.2012, 20:34
Цитата Сообщение от Renox Посмотреть сообщение
она ведь просто переходит каждый раз к следующему элементу, пока может
это же рекурсия. Она разворачивается, а потом обратно сворачивается.
0
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 10
25.09.2012, 20:44  [ТС]
alkagolik, я вижу, что в первой проверке функция запускает себя пока массив не кончится а потом попытается что-то сделать. Т.е программа либо не работает, либо работает, но я не знаю почему, а мне её еще объяснять потом.

Добавлено через 5 минут
Цитата Сообщение от alkagolik Посмотреть сообщение
это же рекурсия. Она разворачивается, а потом обратно сворачивается.
Вроде допер. Вся череда второй проверки на обратном пути выполняется?
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
25.09.2012, 20:52
да. но сама функция глючная. Она отработает только один раз, на все последующие будет неверный результат. Сейчас перепишем
1
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.09.2012, 21:07
получился такой вариант, но думается, что можно в одну строчку
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void Sred(int *a, int *end, int *sum, int *count, int b)
{
   if (a < end)
   {
      if (*a > b)
      {
          *sum += *a;
          (*count)++;
      }
      Sred(a + 1, end, sum, count, b);
   }
}
 
int main() {
 
   int sum = 0, count = 0, n, a[] = {1, 2, 3, 4, 5, 6, 7};
   n = sizeof(a) / sizeof(*a);
   Sred(a, a + n, &sum, &count, 3);
   if (count > 0)
      printf("%f\n", (double)sum/count);
   return 0;
}
0
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 10
25.09.2012, 21:09  [ТС]
Еще пара вопросов - что делает static? Я так понял он делает переменные глобальными внутри этой функции или типа того. И второе - получается все кроме последнего return выдают "левые" решения и служат только для возврата на уровень выше?
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.09.2012, 21:32
Еще вариант
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Sr(int *a, int *end, int sum, int count, double *sred, int b)
{
   if (a < end)
      Sr(a + 1, end, sum + (*a > b ? *a : 0), count + (*a > b), sred, b);
   else *sred = (double)sum / count;
}
 
int main()
{
   int n, a[] = {1, 2, 3, 4, 5, 6, 7};
   double sred;
   n = sizeof(a) / sizeof(*a);
   Sr(a, a + n, 0, 0, &sred, 3);
   printf("%f\n", sred);
   return 0;
}
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
25.09.2012, 21:47
Лучший ответ Сообщение было отмечено как решение

Решение

минимум 5 параметров, меньше никак.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.09.2012, 21:47
Помогаю со студенческими работами здесь

Определить среднее значение всех элементов, значение которых превышает среднее для массива
в произвольно заданном одномерном массиве определить среднее значение всех элементов, значение которых превышает среднее значение....

Найти среднее значение двумерного массива. Найти среднее значение каждой строки
#include &lt;cs50.h&gt; #include &lt;stdio.h&gt; int main(void){ FILE*f; f = fopen(&quot;file&quot;, &quot;w&quot;); int x=2; int y=6; int...

Рекурсия, вычисляющая среднее геометрическое
Составить рекурсивную функцию, вычисляющую среднее геометрическое n элементов одномерного массива.

Среднее значение полученных чисел, количество значений в массиве, превышающих среднее
Вот решаю одну задачку из книги Праты: &quot;Напишите программу, читающую в массив double до 10 значений пожертвований. Программа должна...

Как вычислить среднее значение набора чисел ? (не среднее арифметическое)
Мне нужно найти ср.рост среди всех людей, код я уже написал, но не знаю как вычислить ср.значение


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru