2015-02-24 72 views
0
void reverse() 
{ 
    char c; 
    scanf("%c", &c); 
    if(c!='\n') 
    { 
     reverse(); 
     printf("%c", c); 
    } 
} 

当'c == \ n'时,程序甚至不会进入'if'块。那么它最终如何打印转换后的句子。请解释'返回'发生的位置以及返回的位置。C - 翻转句子 - 递归 - 无阵列

+0

为什么不先读完整个句子,将其翻转,然后将整个颠倒的句子打印出来。步骤2和3可以合并为一个步骤。这很简单,你不需要使用递归。 – thang 2015-02-24 02:36:18

+0

我宁愿认为OP有作业解决方案,但他不知道为什么,因此张贴这个问题。由于这可能不会为大学生做作业,我很乐意解释它。 – miushock 2015-02-24 02:40:26

+0

@thang递归是我现在正在学习的东西。所以问题是使用递归编写代码。谢谢。 – optimist 2015-02-24 02:42:27

回答

3

当'c == \ n'时,它将是递归的结束,函数不会再调用自己,并返回到最后一次调用,它继续'printf(“%c” ,c)',因此打印字符串的最后一个字符,然后返回到第二个最后一个字符,等等。

1

让我们手工运行代码。想象一下,我们输入"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"相反。

希望这可以提供一些关于它如何工作的见解。

+0

太棒了!我真的试过这样做,但不知道什么时候谈到'回归'部分,正如我所说的。对不起,如果我错了。这是您之前说过的调试吗? – optimist 2015-02-24 02:56:49

+0

您可以将此视为“精神”调试的一种形式(您可以通过手动或头脑运行程序)。实际上,我的意思是在计算机上使用调试程序,但是,像gdb,lldb,Visual Studio的调试程序等。这些调试程序可让您在计算机上逐行执行程序,并观察发生了什么(以及为什么)。 – Cornstalks 2015-02-24 02:59:22

+0

太棒了!你介意教我如何做?这将有所帮助。感谢:-) – optimist 2015-02-24 03:05:15