任务是编写一个递归函数,该函数返回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语句可以阻止这种情况。
答案 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;
}
您还应注意,针对此问题使用递归仅出于教学上的原因。通过一个简单的循环可以更好地解决此问题。