PDA

View Full Version : Ricorsione Binaria in c...


progC__
16-09-2005, 08:46
Qualcuno è in grado di trovare l'errore a questo programma..? ...sicuramente è la funzione ricorsiva...ma non so proprio che cambiare...aiutatemi... :muro: :cry: :help:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int somma_ric(int *a, int inizio, int fine);
void main()
{
int *num,somma,start,i,end;
start = 1;
srand((unsigned) time(NULL));
printf ("Inserisci di quanti elementi deve essere formato l'array:\n");
fflush(stdin);
scanf("%d",&end);
fflush(stdin);
num = malloc(end);
if (num == NULL){
puts ("ERRORE ALLOCAZIONE MEMORIA");
exit(1);
}
printf ("L'array generato in modo casuale e':\n");
fflush(stdin);
for (i = 1; i <= end;i++){
num [i] = 0 + rand() % 40;
printf ("%d\n",num[i]);
}
fflush(stdin);
somma=somma_ric(num,start,end);
printf ("La somma dei suoi elementi e'%d.\n\n\n",somma);
}

/*funzione somma ricorsiva binaria elementi array*/
int somma_ric(int *a, int inizio,int fine)
{
int mediano,temp,somma_1,somma_2;
temp = fine;
mediano = (fine)/2;
if (mediano < 1)
return 0;
else
somma_1 = a[mediano] + somma_ric(a,inizio,mediano-1);
if (temp > mediano)
somma_2 = a[temp] + somma_ric (a,temp-1,mediano);
return somma_1 + somma_2;
}

Brazorv
16-09-2005, 08:50
somma_2 = a[temp] + somma_ric (a,mediano+1,fine-1);

prova così

EDIT

progC__
16-09-2005, 08:53
ho provato...e Niente...adesso il programma non mi dà nemmeno il risultato....

cionci
16-09-2005, 09:35
num = malloc(end * sizeof(int));

progC__
16-09-2005, 10:56
...Gia avevo provato una cosa analoga con CALLOC... ma probabilmente non riguarda l'allocazione di memoria...NON FUNZIONA... :cry: :muro:

cionci
16-09-2005, 11:27
...Gia avevo provato una cosa analoga con CALLOC... ma probabilmente non riguarda l'allocazione di memoria...NON FUNZIONA... :cry: :muro:
Quello era sicuramente un errore... Perchè alla malloc devi passare il numero di byte...

for (i = 1; i <= end;i++)

Il for è sbagliato... I vettori sono zero-based quindi li devi accedere da i=0 a i<end...

A che serve lo zero prima della rand ? A niente ;)

Poi suppongo che ci siano altri errori in mediano...ad esempio start deve essere uguale a 0...

cionci
16-09-2005, 11:28
Anzi deve essere così la malloc:

num = (int *)malloc(end * sizeof(int));

progC__
16-09-2005, 11:43
con calloc ho provato facendo così: calloc (end,sizeof(int))
che è praticamente la stessa cosa di malloc (end*sizeof(int))....nel for ho messo i = 1 a posta perchè non mi trovavo con la printf e i numeri che venivano generati dalla rand...praticamente gli davo tre numeri e la printf me ne restituiva 4....adesso ho provato a cambiare un pò le cose come hai detto tu...solo che la somma data è un numero col meno....niente......

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int somma_ric(int *a, int inizio, int fine);
void main()
{
int *num,somma,start,i,end;
start = 0;
srand((unsigned) time(NULL));
printf ("Inserisci di quanti elementi deve essere formato l'array:\n");
fflush(stdin);
scanf("%d",&end);
fflush(stdin);
num = (int*)malloc(end*sizeof(int));
if (num == NULL){
puts ("ERRORE ALLOCAZIONE MEMORIA");
exit(1);
}
printf ("L'array generato in modo casuale e':\n");
fflush(stdin);
for (i = 0; i < end;i++){
num [i] = 0 + rand() % 40;
printf ("%d\n",num[i]);
}
fflush(stdin);
somma=somma_ric(num,start,end);
printf ("La somma dei suoi elementi e'%d.\n\n\n",somma);
}

/*funzione somma ricorsiva binaria elementi array*/
int somma_ric(int *a, int inizio,int fine)
{
int mediano,temp,somma_1,somma_2;
temp = fine;
mediano = (fine)/2;
if (mediano < 1)
return 0;
else
somma_1 = a[mediano] + somma_ric(a,inizio,mediano-1);
if (temp > mediano)
somma_2 = a[temp] + somma_ric (a,temp-1,mediano);
return somma_1 + somma_2;

}

progC__
16-09-2005, 11:45
lo zero prima della rand...mi sa che forse non serve a niente......

Qu@ker
16-09-2005, 17:10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int somma(int *a, int inizio, int fine)
{
int med;

if (inizio > fine)
return 0;
med = (inizio+fine)/2;
return a[med] + somma(a, inizio, med-1) + somma(a, med+1, fine);
}

int main()
{
int *num, i, end;
srand((unsigned) time(NULL));
printf ("Inserisci il numero degli elementi dell'array: ");
fflush(stdout);
scanf("%d", &end);
if ((num = malloc(end*sizeof(int))) == NULL) {
perror ("malloc()");
exit(1);
}
printf ("L'array generato in modo casuale e':\n");
for (i = 0; i < end;i++){
num[i] = rand() % 40;
printf ("%d\n", num[i]);
}
printf ("La somma dei suoi elementi e' %d.\n", somma(num, 0, end-1));
return 0;
}

progC__
16-09-2005, 18:11
:D :D :D ....GRAZIE [email protected] PROGRAMMA FUNZIONA BENE... :) :) :) :) :) :) ....