【问题标题】:Recursive function to return number in char array递归函数返回字符数组中的数字
【发布时间】:2019-04-22 17:21:43
【问题描述】:

任务是编写一个递归函数,它返回 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 成为全局变量。

此外,出乎我意料的是,它在 bot 行中输出“c”作为结果。 我认为我的 if 语句应该防止这种情况发生。

【问题讨论】:

  • "...返回最后一个数字..." - “最后一个数字”是指最后一个 数字字符 ??相关:如果您应该是微不足道的递归函数有一个硬循环(while/for),那可能是错误的。想想 recursion 是如何循环的;不是函数的非递归部分。
  • 我编辑了这个问题,因为我问得不好。

标签: c recursion


【解决方案1】:

递归调用函数,直到到达\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 ;
    }

【讨论】:

  • 感谢您的回答,它有效,现在我试图了解会发生什么。该函数被调用,首先它检查它是否是数组的末尾。如果不是,我们使用下一个元素再次调用该函数。这种情况一直持续到结束。如果到达末尾,则第二个 if 语句检查它是否是数字。但它是如何工作的,它只返回最后一个数字。我真的不明白这个。
  • ret == '0' 还是“0”? (描述不清楚)
  • @AnttiHaapala 好收获:D。但是返回类型是char。有什么建议吗?
  • 0 是char 的可能值。或者它确实需要返回'0',无法判断。
  • 当我们挑剔时,数组索引是多余的。如果调用者想从其他地方开始,则可以将偏移量添加到指针中。将偏移量作为参数并不是不合理的,但它使递归变得毫无意义,但由于这是对递归的复杂使用,它并不重要。
【解决方案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;
}

【讨论】:

    【解决方案3】:

    您需要了解递归。尝试阅读有关它的信息。不需要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;
    }
    

    您还应该注意,对这个问题使用递归只是出于教学原因。这个问题最好用一个简单的循环来解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 2020-09-25
      • 2021-02-08
      • 2018-08-28
      • 2015-06-05
      • 1970-01-01
      相关资源
      最近更新 更多