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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Renox
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 10
#1

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

25.09.2012, 19:15. Просмотров 584. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.09.2012, 19:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Рекурсия. Среднее значение (C++):

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

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

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

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

Найти среднее значение чисел, а также количество значений в массиве, превышающих среднее - C++
Сделал в лоб, голова совсем не варит под вечер: // sp_Ch6_Pg300_Ex02 /// Занятия по книге Стивена Праты "Язык программирования С++"...

Рекурсия (среднее арифметическое, наименьший элемент, сумма) - C++
На вход с клавиатуры подается последовательность чисел a1, a2, ..., которая заканчивается повторным введением предыдущего числа (второй раз...

12
alkagolik
Заблокирован
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;
}
0
Renox
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 10
25.09.2012, 20:16  [ТС] #3
разве эта функция пройдет дальше первой проверки?
она ведь просто переходит каждый раз к следующему элементу, пока может
0
I.M.
565 / 548 / 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;
//...
}
1
alkagolik
Заблокирован
25.09.2012, 20:26 #5
Renox, а проверить?
0
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
25.09.2012, 20:30 #6
Цитата Сообщение от Renox Посмотреть сообщение
разве эта функция пройдет дальше первой проверки?
она ведь просто переходит каждый раз к следующему элементу, пока может
Она работает верно. За счет
static int count = 0, sum = 0;
0
alkagolik
Заблокирован
25.09.2012, 20:34 #7
Цитата Сообщение от Renox Посмотреть сообщение
она ведь просто переходит каждый раз к следующему элементу, пока может
это же рекурсия. Она разворачивается, а потом обратно сворачивается.
0
Renox
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 10
25.09.2012, 20:44  [ТС] #8
alkagolik, я вижу, что в первой проверке функция запускает себя пока массив не кончится а потом попытается что-то сделать. Т.е программа либо не работает, либо работает, но я не знаю почему, а мне её еще объяснять потом.

Добавлено через 5 минут
Цитата Сообщение от alkagolik Посмотреть сообщение
это же рекурсия. Она разворачивается, а потом обратно сворачивается.
Вроде допер. Вся череда второй проверки на обратном пути выполняется?
0
alkagolik
Заблокирован
25.09.2012, 20:52 #9
да. но сама функция глючная. Она отработает только один раз, на все последующие будет неверный результат. Сейчас перепишем
1
Thinker
Эксперт С++
4227 / 2201 / 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;
}
0
Renox
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 10
25.09.2012, 21:09  [ТС] #11
Еще пара вопросов - что делает static? Я так понял он делает переменные глобальными внутри этой функции или типа того. И второе - получается все кроме последнего return выдают "левые" решения и служат только для возврата на уровень выше?
0
Thinker
Эксперт С++
4227 / 2201 / 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;
}
0
alkagolik
Заблокирован
25.09.2012, 21:47 #13
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
минимум 5 параметров, меньше никак.
0
25.09.2012, 21:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2012, 21:47
Привет! Вот еще темы с ответами:

Найти столбик, в котором среднее арифметическое значение из положительных элементов имеет минимальное значение - C++
Никак не могу понять задачу, помогите написать программу, очень нужно ! В части матрицы, расположенной под вспомогательной диагональю,...

Замена всех элементов массива, значение которых превышает среднее значение, максимальным элементом - C++
Написать функцию для замены всех элементов массива значение которых превышает среднее значение максимального и минимального элемента...

Рекурсия,возвращающая значение - C++
Разработать рекурсивную функцию, возвращающую значение для перевода числа из десятичной системы счисления в двоичную.И если не...

Вычислить значение функции a = b ^2 sin (b), причем b изменяется от 0,9 до 1,7 с шагом 0,2. Найти среднее значение разности между элементами - C++
Доброго времени суток ! Помогите решить задачу ! Нужно написать в цикле с постусловием следующее : Вычислить значение функции...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru