递归函数返回char数组中的数字

时间:2019-04-22 08:46:58

标签: c recursion

任务是编写一个递归函数,该函数返回char数组中的最后一个数字(ASCII)。如果给定数组中没有数字,则应返回0。

修改

在这种情况下,该函数应仅从数组a返回“ 4”,因为它是该数组中的最后一个数字,而在数组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 个答案:

答案 0 :(得分:2)

递归调用该函数,直到到达\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 :(得分:2)

每当使用递归时,都应尝试实现tail recursion,因为考虑到尾递归函数比非尾递归函数更好,因为编译器可以优化尾递归。

使用尾部递归,您可以执行以下操作:

#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 :(得分:1)

您需要了解递归。尝试对此有所了解。不需要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;
}

您还应注意,针对此问题使用递归仅出于教学上的原因。通过一个简单的循环可以更好地解决此问题。