void reverseSentence()
{
char c;
scanf("%c", &c);
if(c != 'n')
{
reverseSentence();
printf("%c", c);
}
}
我不明白的是,如果一次又一次调用递归功能,则控件何时打印函数并打印呼叫堆栈?
要理解此代码,让我们首先查看非反转版本:
void reverseSentence() {
char c;
scanf("%c", &c);
if (c != 'n')
{
printf("%c",c);
reverseSentence();
}
}
它读取 stdin的字符,如果该字符不是新线,则将其写回。然后,它没有明确地循环,而是通过递归循环循环读取和打印下一个字符:
local> echo "The elephants are coming!" | ./a.out
The elephants are coming!local>
该功能在每次递归中都在读取和打印一个字符。现在,如果我们将这两条线的顺序撤消,如原件:
reverseSentence();
printf("%c",c);
同样的事情发生了
local> echo "The elephants are coming!" | ./a.out
!gnimoc era stnahpele ehTlocal>
仍在每次递归上读取并写入一个字符,但利用首先重复出现的事实,然后以相反的顺序处理当前项目。处理当前项目,然后再进行恢复,以远期顺序处理数据。
当函数调用自己时,printf才会搁置,直到完成函数。
使用输入" hi n",它看起来像这样:
scanf -> H
reverseSentence()
scanf -> i
reverseSentence()
scanf -> n
return
printf -> i
return
printf -> H
return
通过调试器踏上可以帮助您理解的。