Visualizzazione dei risultati da 1 a 4 su 4

Discussione: [C]Ricorsione

  1. #1

    [C]Ricorsione

    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

    codice:
    #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
    codice:
    #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

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

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,563
    Sbagli un sacco di roba, perciò ti presenterò due esempi funzionanti che potrai studiarti.
    codice:
    #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.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    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
    codice:
    #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

    codice:
    #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;

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,563
    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.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2019 vBulletin Solutions, Inc. All rights reserved.