#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.Ведь изначально количество нам не известно.
Заранее благодарю.
Цитата:
Originally posted by матеос
помогите написать программу рекурсивную(!) вычисления среднего арифметического непустого списка на Си
помогите написать программу рекурсивную(!) вычисления среднего арифметического непустого списка на Си
Код:
Всё что получилось. Если устраивает и речь идёт о связанных списках то можно переделать :
Цитата:
Проблема в том, как одновременно рекурсивно считать сумму и 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;
}
{
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. Думаю переделала правильно, но могут быть ошибки!!
Цитата:
Originally posted by OlgaKr
P.S. Думаю переделала правильно, но могут быть ошибки!!
Код:
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;
}
{
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;
}
#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;
}
Благодарю