1.下列代码的输出是?(注:print已经声明过)
链接:https://www.nowcoder.com/questionTerminal/d2d9e5807e9d4b4e995a0216bd873481
来源:牛客网
main(){
char str[]="Geneius";
print (str);
}
print(char *s){
if(*s){
print(++s);
printf("%c",*s);
}
}
解答:输出的是" suiene"(注意,字母前面有一个空格)
这里考察了两个知识点:递归和print(++s),指针先移动,然后调用函数。
找到一篇讲解递归的博客:递归算法
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。递归有直接递归
和间接递归
•直接递归:函数在执行过程中调用本身。
•间接递归:函数在执行过程中调用其它函数再经过这些函数调用本身。
下面是网上的一个解释:
大家应该都看出这是递归了,但是既然错了那就认认真真一遍一遍写出来,看看是哪里错了:
1、*s为G,执行print(e),printf(e)被压入倒数第1层,应该输出e;
2、*s为e,执行print(n),printf(n)被压入倒数第2层,应该输出n;
3、*s为n,执行print(e),printf (e) 被压入倒数第3层,应该输出e;
4、*s为e,执行print(i),printf (i) 被压入倒数第4层,应该输出i;
5、*s为i,执行print(u),printf (u) 被压入倒数第5层,应该输出u;
6、*s为u,执行print(s),printf (s) 被压入倒数第6层,应该输出s;
7、*s为s,执行print(\0),printf (\0) 被压入倒数第7层,应该输出空格;
8、开始跳出print,从上向下得到压入栈中的printf,得到最后结果“ suiene”
代码及结果如下:
void print(char *s){
if (*s){
print(++s);
printf("%c", *s);
}
}
int main(){
char str[] = "Geneius";
print(str);
}
输出结果: \0suiene