C - 反转句子 - 递归 - 无数组

C - Reversing a sentence - Recursion - Without Array

void reverse()
{
    char c;
    scanf("%c", &c);
    if(c!='\n')
    {
        reverse();
        printf("%c", c);
    }
}

当 'c==\n' 时,程序甚至没有进入 'if' 块。那它最后是怎么打印转换后的句子的呢。请解释 'return' 发生的位置以及它返回的位置。

当'c==\n'时,将是递归的结束,函数将不会再调用自身,return到最后一次调用,在[=13=行继续],从而打印字符串的最后一个字符,然后 return 到倒数第二个调用等等..

让我们运行 手写代码。假设我们输入 "foobar"。我们将记下计算机处理的每条指令。如果我们递归,我们将在跟踪事物时缩进。如果我们这样做,我们可以看到执行的指令序列是:

scanf() // reads 'f'
if ('f' != '\n')
  scanf() // reads 'o'
  if ('o' != '\n')
    scanf() // reads 'o'
    if ('o' != '\n')
      scanf() // reads 'b'
      if ('b' != '\n')
        scanf() // reads 'a'
        if ('a' != '\n')
          scanf() // reads 'r'
          if ('r' != '\n')
            scanf() // reads '\n'
            if ('\n' != '\n')
          printf('r')
        print('a')
      print('b')
    print('o')
  print('o')
print('f')

每个缩进都是对 reverse() 的递归调用。如您所见,printf() 命令的顺序与输入 "foobar".

的顺序相反

希望这能让您对它的工作原理有所了解。