解释所需的C递归

我需要一些特殊代码的帮助。 我并没有真正理解它。 有人可以花点时间向我解释一下吗? 它所做的就是用一个字来打印出它的反面。 我不理解递归部分,但是对于n = 1,for循环只运行一次,递归将运行直到它读取整个单词并且它符合”标记,但是它如何打印出反转字?

void reverse() { char c; scanf("%c", &c); if (c!=' ') { reverse(); } printf("%c", c); } int main() { int n, i; printf("\nThe number of the words="); scanf("%d", &n); for(i=1; i<=n; ++i) { reverse(); printf("\n"); } printf("\nEnd of the program.\n"); return 0; } 

注意您的示例位于底部,首先是您的标题问题: 解释所需的C递归

递归是一种允许操作调用自身的编程技术。
一个简单(但毫无意义)的例子是:

 void call(void); int main(void) { call(); } void call(void) { call(); } 

注意:这将直到堆栈确定有太多的调用已经堆积,并使程序崩溃。

一个更有意义的例子 (例证)是写一个回文字符系列(A – Z):

 void Palindrome(char a) { char b[2]; sprintf(b, "%c", a); printf(b); if((a >= 65)&&(a < 90)) { Palindrome(a+1); } sprintf(b, "%c", a); printf(b); } 

最后一个例子实际上做了第一个例子没有做的两件重要事情:
1) 如果((a> = 65)&&(a <= 90),则有一个受控的退出标准
2)使用先前调用的结果和后续调用。

在您的示例中 :程序工作的原因是每次操作调用自身时,它都会更深入地嵌套(每个调用一个嵌套)到以下部分:(对于所有递归程序都是如此)

  { reverse(); } 

概念类似于:

 { //do something { //do something { //do something //... and so on for as many recursions are necessary to meet exit criteria } } } 

“......那么它如何打印掉反转的字?”
只有在递归达到编程限制后,执行才会向下流过关闭}并点击下一部分,继续自行展开,每次以堆栈的相反顺序访问c的值,直到每个嵌套级别都被展开:

  } //after exit criteria is met, execution flow goes from here.... printf("%c", c); //prints values of c in reverse order. } //to here until number of recursions is exhausted. 

那时,如果你逐步使用调试器,你会看到每次执行printf()流程从上部}到下部}

这确实有点难以获得; 递归的反转通过递归地从输入中获得越来越多的字符直到输入一些终端符号' '来工作。 输入隐式存储在堆栈中,直到在每次递归的reverse调用终止时打印。

请注意,字符仅打印到输出,但它们不会存储在任何地方以供以后访问; 一旦第一次reverse呼叫终止,就不能再获得它们。