我正在阅读一份 pdf 来研究递归和字符串操作,我偶然发现了这一点。我通常了解递归函数的行为方式(仍然不是那么好),但无法弄清楚这一点。这会反转字符串。好吧,打印它相反。
void reverse(const char *const sptr);
int main()
{
char sentence[80];
printf("Enter a line of text:\n");
gets(sentence);
printf("\nThe reversed version:\n");
reverse(sentence);
puts("");
return 0;
}
void reverse(const char *const sptr)
{
if(sptr[0] == '\0')
{
return;
}
else{
reverse(&sptr[1]);
putchar(sptr[0]);
}
}
我不太明白 putchar 在这种情况下是如何工作的。谁能给我解释一下吗?我想这不仅仅是针对 putchar,当调用函数“之后”写入另一个命令行时,该函数的行为如何?
最佳答案
它与 putchar 无关,它与递归有关。
假设您给它字符串 "1234"
- 或者我们称之为 ['1','2','3','4','\0']
第一次调用反向时,调用时参数 sptr 指向 ['1','2','3','4','\0']
;
执行到reverse的递归调用,这次使用偏移量1,因此参数变为['2','3','4','\0']
重复该过程,直到找到'\0'
,现在该函数返回到前一个调用者,打印最后一个字符,返回到前一个调用者,打印第二个最后一个字符依此类推,直到到达顶部反向调用,该调用打印第一个字符,然后存在。
也许打印一些额外的调试信息会让它更容易理解。
#include <stdio.h>
void reverse(const char *const sptr);
int recursion_level;
int main()
{
recursion_level=0;
char sentence[80]="1234";
// printf("Enter a line of text:\n");
// gets(sentence);
printf("\nThe reversed version:\n");
reverse(sentence);
puts("");
return 0;
}
void reverse(const char *const sptr)
{
recursion_level++;
printf("reverse entered, recursion level:%d , sptr:%s \n",recursion_level, sptr);
if(sptr[0] == '\0')
{ recursion_level--;
return;
}
else{
reverse(&sptr[1]);
putchar(sptr[0]);
}
printf("\n reverse exits, recursion level:%d , \n",recursion_level);
recursion_level--;
}
生成以下输出
The reversed version:
reverse entered, recursion level:1 , sptr:1234
reverse entered, recursion level:2 , sptr:234
reverse entered, recursion level:3 , sptr:34
reverse entered, recursion level:4 , sptr:4
reverse entered, recursion level:5 , sptr:
4
reverse exits, recursion level:4 ,
3
reverse exits, recursion level:3 ,
2
reverse exits, recursion level:2 ,
1
reverse exits, recursion level:1 ,
关于c - 递归函数,调用后命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54158437/