为什么这段代码是正确的?

时间:2017-11-13 12:20:44

标签: c recursion

#include <stdio.h>
void reverseSentence();

int main()
{
  printf("Enter a sentence: ");
  reverseSentence();

  return 0;
}

void reverseSentence()
{
  char c;
  scanf("%c", &c);

  if( c != '\n')
  {
    reverseSentence();
    printf("%c",c);
  }

我尝试了这段代码,我知道它是正确的,但我不知道递归的原因。这看起来有点不直观。请问有人可以说明它的工作原理吗?另外,\n究竟在做什么?(这就是我认为我的问题的答案所在的地方)。感谢。

3 个答案:

答案 0 :(得分:2)

名称reverseSentence对于递归而言非常糟糕。

它会读取一个字符并将其保存在局部变量中。

然后,如果角色不是换行符(== \n),它将再次调用自己。这将以递归方式发生,直到输入换行符。之后,它将打印其角色。

因为在最后你将遍历调用堆栈,这将以相反的顺序调用不同的实例。 →字符串将反向输出

答案 1 :(得分:2)

我们假设您正在尝试输入单词&#34; elf&#34; (最后用#34; \ n&#34;)字符。

该程序应打印:&#34; fle&#34;。

  1. 程序进入reverseSentence()。
  2. 程序扫描&#39;它不是&#39; \ n&#39;因此输入reverseSentence()。 C =&#39; E&#39;
  3. 程序扫描&#39; l,它不是&#39; \ n&#39;因此输入reverseSentence()。 C =&#39;升&#39;

  4. 程序扫描&#39; f,#not;&#39; \ n&#39;因此输入reverseSentence()。 C =&#39; F&#39;

  5. 程序扫描&#39; \ n&#39;,它是&#39; \ n&#39;因此退出reverseSentence()并转到(4)中最后一个被调用的reverseSentece()实例。 / LI>
  6. 在printf之前的reverseSentence()中的最后一次调用,它现在打印c。 c在最后一次电话会议中(4)是:&#39; f&#39;。它打印f和退出。它转到上一次调用(3)中的reverseSentence()。
  7. 就像之前打印c =&#39; l&#39;并退出。
  8. 它转到上一个调用或(2)中的reverseSentence()。它打印c =&#39; e&#39;并退出。
  9. 我希望帮助

答案 2 :(得分:0)

scanf&#34;消费&#34;它读取的char,这意味着在函数的下一次调用中,该行将缩短1个字符,因为前一个递归调用已经使用了该字符。