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"
.
的顺序相反
希望这能让您对它的工作原理有所了解。
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"
.
希望这能让您对它的工作原理有所了解。