【问题标题】:Why is this code correct? [closed]为什么这段代码是正确的? [关闭]
【发布时间】:2018-04-26 03:09:09
【问题描述】:
#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 到底在做什么?(这就是我认为我的问题的答案所在)。谢谢。

【问题讨论】:

  • 你试过用调试器单步调试吗?
  • 何时以及如何不使用递归的完美示例。
  • 有一个关于递归如何工作的解释here
  • scanf("%c", &amp;c);更改为scanf(" %c", &amp;c);

标签: c recursion


【解决方案1】:

假设您尝试在末尾键入单词“elf”(带有“\n”)字符。

程序应该打印:“fle”。

  1. 程序进入reverseSentence()。
  2. 程序扫描'e',不是'\n',因此进入reverseSentence()。 c='e'
  3. 程序扫描'l',不是'\n',因此进入reverseSentence()。 c='l'

  4. 程序扫描'f',不是'\n',因此进入reverseSentence()。 c='f'

  5. 程序扫描 '\n',它是 '\n',因此退出 reverseSentence() 并转到 (4) 中最后调用的 reverseSentece() 实例。
  6. reverseSentence() 中的最后一次调用在 printf 之前停止,它现在打印 c。最后一次调用 (4) 中的 c 是:'f'。它打印 f 并退出。它转到 (3) 中的上一个 reverseSentence() 调用。
  7. 就像打印 c='l' 并退出之前一样。
  8. 转到前一个调用或 (2) 中的 reverseSentence()。它打印 c='e' 并退出。

希望对你有帮助

【讨论】:

    【解决方案2】:

    reverseSentence 这个名字不利于递归。

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

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

    由于最后您将向上遍历调用堆栈,这将以相反的顺序调用不同的实例。 → 字符串将反向输出

    【讨论】:

      【解决方案3】:

      scanf“消耗”它读取的字符,这意味着在函数的下一次调用中,该行将缩短 1 个字符,因为上一个递归调用已经使用了前一个字符。

      【讨论】:

      • 我的意思是想问一下代码是做什么来反转字符串的?
      • @1upon0 根据递归的工作原理,当调用递归函数时,因为 scanf 消耗了一个字符,字符串会更短。这个过程将一直持续到找到\n,当这种情况发生时,找到它的函数完成并且前一个函数继续触发连锁反应,将打印找到的所有字符。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多