Рекурсивная функция для возврата числа в массиве символов - PullRequest
0 голосов
/ 22 апреля 2019

Задача состоит в том, чтобы написать рекурсивную функцию, которая возвращает последнее число (ASCII) в массиве символов.Если в данном массиве нет числа, оно должно вернуть 0.

Редактировать

В этом случае функция должна возвращать только 4 из массива a, потому что онаэто последняя цифра в этом массиве, а в массиве b она должна возвращать '0', потому что в этом массиве вообще нет цифры.

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;
}

Я понимаю, что каждый раз, когда моя функциярекурсивно называется tmp установлен в '0', что не то, что я хочу.

Почему-то я не могу понять, как функция может вызывать себя со следующим элементом в массиве, чтобы посмотреть, не теряязаданное значение tmp.

Я также не хочу делать tmp глобальной переменной.

Кроме того, что для меня было неожиданным, он выводит 'c' в результате в строках бота.Я думал, что мое if-утверждение должно предотвратить это.

Ответы [ 3 ]

2 голосов
/ 22 апреля 2019

Всякий раз, когда используется рекурсия, попробуйте реализовать хвостовую рекурсию , поскольку хвостовая рекурсия считается лучшей, чем не хвостовая рекурсия, поскольку хвостовая рекурсия может быть оптимизирована компилятором.

Используя хвостовую рекурсию, выможно сделать:

#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;
}
2 голосов
/ 22 апреля 2019

Вызывайте функцию рекурсивно, пока не достигнете \0.

И рассмотрим возвращаемое значение рекурсивного вызова.

   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 ;
    }
1 голос
/ 22 апреля 2019

Вы должны понимать рекурсию.Попробуйте прочитать об этом.Нет необходимости в цикле while.Также индекс массива является избыточным, поскольку он рекурсивный.Затем попытайтесь понять это:

#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;
}

Вы также должны заметить, что использование рекурсии для этой проблемы только по педагогическим причинам.Эту проблему лучше решить с помощью простого цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...