Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Renox
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 10
25.09.2012, 19:15     Рекурсия. Среднее значение #1
Помогите пожалуйста с задачей: Напишите рекурсивную функцию, которая находит среднее значение элементов массива, которые больше заданного числа 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 - ума не приложу.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.09.2012, 19:15     Рекурсия. Среднее значение
Посмотрите здесь:

Рекурсия,возвращающая значение C++
C++ Среднее значение полученных чисел, количество значений в массиве, превышающих среднее
Рекурсия. Среднее значение в двумрном массиве C++
C++ программа, которая бы вычисляла среднее значение, максимальный и минимальный элемент второй колонки Excel и выводила это значение на экран
Рекурсия (среднее арифметическое, наименьший элемент, сумма) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
25.09.2012, 19:31     Рекурсия. Среднее значение #2
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;
}
Renox
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 10
25.09.2012, 20:16  [ТС]     Рекурсия. Среднее значение #3
разве эта функция пройдет дальше первой проверки?
она ведь просто переходит каждый раз к следующему элементу, пока может
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
25.09.2012, 20:25     Рекурсия. Среднее значение #4
У вас тут два числа, которые нужно вернуть из рекурсии - промежуточная сумма и количество найденных элементов. Одно можно вернуть ретурном (как вы и делаете), а другое можно передавать по ссылке. Т.е. 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;
//...
}
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
25.09.2012, 20:26     Рекурсия. Среднее значение #5
Renox, а проверить?
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
25.09.2012, 20:30     Рекурсия. Среднее значение #6
Цитата Сообщение от Renox Посмотреть сообщение
разве эта функция пройдет дальше первой проверки?
она ведь просто переходит каждый раз к следующему элементу, пока может
Она работает верно. За счет
static int count = 0, sum = 0;
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
25.09.2012, 20:34     Рекурсия. Среднее значение #7
Цитата Сообщение от Renox Посмотреть сообщение
она ведь просто переходит каждый раз к следующему элементу, пока может
это же рекурсия. Она разворачивается, а потом обратно сворачивается.
Renox
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 10
25.09.2012, 20:44  [ТС]     Рекурсия. Среднее значение #8
alkagolik, я вижу, что в первой проверке функция запускает себя пока массив не кончится а потом попытается что-то сделать. Т.е программа либо не работает, либо работает, но я не знаю почему, а мне её еще объяснять потом.

Добавлено через 5 минут
Цитата Сообщение от alkagolik Посмотреть сообщение
это же рекурсия. Она разворачивается, а потом обратно сворачивается.
Вроде допер. Вся череда второй проверки на обратном пути выполняется?
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
25.09.2012, 20:52     Рекурсия. Среднее значение #9
да. но сама функция глючная. Она отработает только один раз, на все последующие будет неверный результат. Сейчас перепишем
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.09.2012, 21:07     Рекурсия. Среднее значение #10
получился такой вариант, но думается, что можно в одну строчку
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;
}
Renox
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 10
25.09.2012, 21:09  [ТС]     Рекурсия. Среднее значение #11
Еще пара вопросов - что делает static? Я так понял он делает переменные глобальными внутри этой функции или типа того. И второе - получается все кроме последнего return выдают "левые" решения и служат только для возврата на уровень выше?
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.09.2012, 21:32     Рекурсия. Среднее значение #12
Еще вариант
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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2012, 21:47     Рекурсия. Среднее значение
Еще ссылки по теме:

Подскажите как добавить вычесленное среднее значение из подпрограммы 1, в подпрограмму 2, а то в подпрограмме 2 берет среднее значение = 0 C++
Найти столбик, в котором среднее арифметическое значение из положительных элементов имеет минимальное значение C++
Найти среднее значение чисел, а также количество значений в массиве, превышающих среднее C++

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

Или воспользуйтесь поиском по форуму:
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
25.09.2012, 21:47     Рекурсия. Среднее значение #13
Сообщение было отмечено автором темы, экспертом или модератором как ответ
минимум 5 параметров, меньше никак.
Yandex
Объявления
25.09.2012, 21:47     Рекурсия. Среднее значение
Ответ Создать тему
Опции темы

Текущее время: 02:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru