0
votes

Fonction récursive pour renvoyer le numéro dans le tableau de caractères

La tâche consiste à écrire une fonction récursive qui renvoie le dernier numéro (ASCII) dans un tableau de caractères. S'il n'y a pas de numéro dans une matrice donnée, il devrait renvoyer 0.

EDIT STRY> P>

Dans ce cas, la fonction doit seulement renvoyer "4" de la matrice A, car il est Le dernier chiffre fort> Dernier strong> dans ce tableau et dans le tableau B Il doit renvoyer "0", car il n'y a pas de chiffre du tout dans ce tableau. P>

char rek(char a[], int i){
    int j = i;
    char tmp = '0';
    if((a[j] >= '0') && (a[j] <= '9')){
            tmp = a[j];
    }
    while(a[j] != '\0'){
        rek(a, i+1);
    }
    return tmp;
}

int main(){

    char a[7] = {'a','b','1','c','4','n','\0'};
    char b[7] = {'a','b','c','c','a','n','\0'};

    printf("Letzte Ziffer: %c \n", rek(a, 0));
    printf("Letzte Ziffer: %c", rek(b, 0));
    getchar();
    return 0;
}


2 commentaires

"... qui retourne le dernier numéro ..." - par "Dernier numéro" Vous voulez dire le dernier caractère chiffre ?? Related: Si votre fonction recublique de reconsive de manière cruciale a une boucle difficile (tandis que / pour), il est probablement faux. Pensez à la façon dont la la récursion est la boucle; pas la partie non récursive de la fonction.


J'ai édité la question, car cela n'a pas été bien demandé par moi.


3 Réponses :


2
votes

Appelez la fonction de récursivement jusqu'à atteindre \ 0 code>.

et envisagez la valeur de retour de l'appel récursif. p>

   char rek(char a[]){
        char ret = '0';

        if (*a != '\0')
           ret = rek(a+1);

        if((*a >= '0') && (*a <= '9') && ret == '0'){
                ret = *a;
        }

        return ret ;
    }


7 commentaires

Thak vous pour votre réponse ça marche, maintenant j'essaie de comprendre ce qui se passe. La fonction est appelée et tout d'abord vérifie s'il s'agit de la fin de la matrice. Sinon, nous appelons à nouveau la fonction avec l'élément suivant. Cela continue jusqu'à la fin de la fin. Si la fin est atteinte, la deuxième fois si l'instruction vérifie s'il s'agit d'un chiffre. Mais comment ça marche, qu'il ne renvoie que le dernier chiffre. Je ne comprends pas vraiment ça.


ret == '0' ou `0 '? (La description n'était pas claire)


@Anttihaapala bonne prise: d. Mais le type de retour est char . Toute suggestion?


0 est une valeur possible pour char . Ou peut-être que fait doit retourner '0' , ne peut pas dire.


Lorsque nous sommes dans Nitpicking, l'indice de tableau est redondant. Si l'appelant veut commencer ailleurs, le décalage pourrait être ajouté au pointeur. Ce n'est pas déraisonnable d'avoir un décalage comme un argument, mais cela rend la récursive inutile, mais comme il s'agit d'une utilisation compliquée de la récursivité, cela n'a pas vraiment d'importance.


@Anttihaapala retournera finalement d'octet nul.


@Lobster Nous vérifions la valeur de retour. Si le chiffre n'est pas trouvé jusqu'à présent, l'appel de chaque fonction renvoie "0" et lorsque le chiffre valide est trouvé, nous recherchons la valeur de retour d'appels précédents si c'est 0 seulement nous retournerons un chiffre nouvellement trouvé trouvé .



1
votes

Vous devez comprendre la récursion. Essayez de lire Abit à ce sujet. Il n'y a pas besoin de la boucle while. De plus, l'indice de tableau est redondant puisqu'il est récursif. Ensuite, essayez de comprendre ceci:

#include <stdio.h>

char rek(char a[]){
    if(*a != 0){ /* If we are not at the end of the string ... */
        char tmp = rek(a + 1); /*... do a recursive call at the next char.*/
        if(tmp) return tmp; /* If there are numbers later in the string return that. */
    }
    if((*a >= '0') && (*a <= '9'))
        return *a;
    else
        return 0;
}

int main(){

    char a[7] = {'a','b','1','c','4','n','\0'};
    char b[7] = {'a','b','c','c','a','n','\0'};

    printf("Letzte Ziffer: %c \n", rek(a));
    printf("Letzte Ziffer: %c", rek(b));

    return 0;
}


0 commentaires

2
votes

Chaque fois que vous utilisez une récursion, essayez de mettre en œuvre Récuissation queue parce que Les fonctions récursives de la queue considérées mieux que les fonctions récursives de la queue en tant que récursives de la queue peuvent être optimisées par compilateur.

Utilisation de la récursion de la queue, vous pouvez faire: P>

#include <stdio.h>

char rek(char a[], char i){
    if (*a == '\0')
        return i;

    if ((*a >= '0') && (*a <= '9'))
        i = *a;

    return rek(++a, i);
}

int main(){

    char a[7] = {'a','b','1','c','4','n','\0'};
    char b[7] = {'a','b','c','c','a','n','\0'};

    printf("Letzte Ziffer: %c \n", rek(a, '0'));
    printf("Letzte Ziffer: %c", rek(b, '0'));
    getchar();
    return 0;
}


0 commentaires