PDA

Visualizza la versione completa : [C]Ricorsione


maseeeeeee
31-08-2014, 14:23
Salve a tutti ho un particolare errore(misà che non ho capito la ricorsione).
dato un array di interi creare un nuovo array di ordine inverso usando la ricorsione senza cicli.
posto il codice.Grazie in anticipo come sempre

FILE.C


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "ex7-es3.h"
int* invertiArray(int* a, unsigned int size){
int cont=0;
int cont2=1;
int* nuovoarray;
nuovoarray=(int*)malloc((size)*sizeof(int));
mia(nuovoarray,a,size,cont,cont2);
return nuovoarray;
}


void mia(int* c,int* a,unsigned int size,int cont,int cont2){
int elem;
elem=a[cont];
if(elem == a[size-1]){
c[0]=elem;
}
else{
cont++;
mia(c,a,size,cont,cont2);
c[cont2]=elem;
cont2++;
}
}


FILE MAIN.C

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "ex7-es3.h"

#define N 4

int main(){
int array[N];
int* p;
for(int i=0;i<N;i++){
printf("inserisci l'elemento in pos[%d]: ",i);
scanf("%d",&array[i]);
}
p=invertiArray(array,N);
for(int q=0;q<N;q++){
printf("%d ",p[q]);
}
return 0;
}

Nel caso servissero sono pronti a scrivere anche il makefile e il file.h:cool:

da input inserisco 1,2,3,4,mi restituisce 4,1,0,0

Scara95
31-08-2014, 15:27
Sbagli un sacco di roba, perciò ti presenterò due esempi funzionanti che potrai studiarti.
#include <stdio.h>
#include <stdlib.h>

int *_reverse(int *a, int sz, int *na, int i) {
if(i == sz) return na;
na[sz-i-1] = a[i];
return _reverse(a, sz, na, i+1);
}

int *reverse(int *a, int size) {
int *na = (int *)malloc(sizeof(int)*size);
return _reverse(a, size, na, 0);
}

void _reverse1(int *a, int *na, int sz) {
if(sz == 0) return;
*na=*a;
return _reverse1(a-1, na+1, sz-1);
}

int *reverse1(int *a, int size) {
int *na = (int *)malloc(sizeof(int)*size);
_reverse1(a+size-1, na, size);
return na;
}

int main(void) {
int a[4] = {1,2,3,4};
int *b = reverse(a, 4);
int *c = reverse1(b, 4);
int i;
for(i = 0; i < 4; ++i)
printf("%d\t%d\n", b[i], c[i]);
free(b);
free(c);
return 0;
}


Da notare comunque che C e ricorsione non vanno proprio a braccetto e neanche ricorsione e array.

maseeeeeee
01-09-2014, 10:24
io ho risolto così adesso va!!!ma non capisco la differenza tra il vecchio codice e questo che posto adesso..Grazie in anticipo..

FILE.C

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "ex7-es3.h"
#define N 4
int* invertiArray(int* a, unsigned int size){
int cont=0;
int cont2=N-1;
int* nuovoarray;
nuovoarray=(int*)malloc((size)*sizeof(int));
mia(nuovoarray,a,size,cont,cont2);
return nuovoarray;
}


void mia(int* c,int* a,unsigned int size,int cont,int cont2){
if(a[cont] == a[size-1]){
c[cont2]=a[cont];
}
else{
mia(c,a,size,cont+1,cont2-1);
c[cont2]=a[cont];
}
}





FILE.MAIN.C


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "ex7-es3.h"

#define N 4

int main(){
int array[N];
int* p;
for(int i=0;i<N;i++){
printf("inserisci l'elemento in pos[%d]: ",i);
scanf("%d",&array[i]);
}
p=invertiArray(array,N);
for(int q=0;q<N;q++){
printf("%d ",p[q]);
}
return 0;

Scara95
01-09-2014, 10:54
Quel codice è ancora mal organizzato. Comunque per comprendere il funzionamento del codice (tuo e mio) puoi risolverlo passo passo manualmente su un foglio di carta.

Loading