Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

среднее арифметическое

16K
05 марта 2006 года
матеос
2 / / 05.03.2006
Помогите написать программу рекурсивную(!) вычисления среднего арифметического непустого списка на Си.
Проблема в том, как одновременно рекурсивно считать сумму и n.Ведь изначально количество нам не известно.
Заранее благодарю.
242
05 марта 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by матеос
помогите написать программу рекурсивную(!) вычисления среднего арифметического непустого списка на Си


Код:
#include <stdio.h>

float CalcX(int[]);
int CalcXMed(int[], int *, int,int);


int main(void)
{
int arr[] = {4,11,55,23,8,-1};// -1 is end of the arr

    printf("%f\n",CalcX(arr));
    return 0;

}

float CalcX(int arr[])
{
int n = 0;
return (float)CalcXMed(arr, &n, 0, 0) / n;
}
int CalcXMed(int arr[],int *p,int index, int sum)
{
if(arr[index] != -1)
{
++(*p);
sum += CalcXMed(arr,p,++index,arr[index]);
}

return sum;
}


Всё что получилось. Если устраивает и речь идёт о связанных списках то можно переделать :
Цитата:
Проблема в том, как одновременно рекурсивно считать сумму и n.Ведь изначально количество нам не известно.



Код:
struct list
{
int num;
struct list *next;
}
float CalcX(list* headlist)
{
int n=0;
return (float)CalcXMed(headlist, 0,&n) / n;
}

int CalcXMed(list* headlist,int sum,int* p)
{
//static int amount = 0;

if(headlist != null)
{
//amount++;
++*p; // ++*p - вычеслсние кол - ва элементов
sum += CalcXMed(headlist->next,headlist->num, p);
}

//*p = amount;
return sum;
}


P.S. Думаю переделала правильно, но могут быть ошибки!!
7.9K
05 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by OlgaKr
Код:
struct list
{
int num;
struct list *next;
}
float CalcX(list* headlist)
{
int n=0;
return (float)CalcXMed(headlist, 0,&n) / n;
}

int CalcXMed(list* headlist,int sum,int* p)
{
//static int amount = 0;

if(headlist != null)
{
//amount++;
++*p; // ++*p - вычеслсние кол - ва элементов
sum += CalcXMed(headlist->next,headlist->num, p);
}

//*p = amount;
return sum;
}

P.S. Думаю переделала правильно, но могут быть ошибки!!

Прога правильна, но можно сделать с одной ф-ей.

Код:
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"

struct list
{
  float num;
  list *next;
};

float calcMed(list *l, float sum, int N)
{
  printf("%.0f ", l->num);

  if(l->next!=0)
    return calcMed(l->next, sum+l->num, N+1);
  else
    return (sum+l->num)/(N+1);
}

int main(int argc, char* argv[])
{
  // Inicializacija
  list *head = new list;
  head->num = 3.0;
  list *l;
  l = new list;
  head->next = l;
  l->num = 5.0;
  l->next = new list;
  l = l->next;
  l->num = 17.0;
  l->next = new list;
  l = l->next;
  l->num = 13.0;
  l->next = 0;

  float sum = calcMed(head, 0.0, 0);
  printf(" = %f", sum);
  printf("\n\n nazsmite ljubuju klavisu...");
  getch();

  while(true)
  {
    l = head->next;
    delete head;
    if(l==0)break;
    head = l;
  };
  return 1;
}
16K
05 марта 2006 года
матеос
2 / / 05.03.2006
Благодарю
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог