C ++递归堆栈

时间:2012-10-06 18:43:32

标签: c++ recursion

我很困惑Recursion在这个例子中是如何工作的。如果输入'ABC \ n',则输出CBA。如果有人能够完成整个过程,我将非常感激。

  1. 在main()中,调用ReverseLine()
  2. local automtic myInput接收'ABC \ n'

  3. 然后检查myInput是否为'\ n'和EOF,这是我开始感到困惑的地方

  4. 我认为它说,A!='\ n'和A!= EOF所以ReverseLine()再次被调用,但那又是什么???

    递归是如何工作的,我只是想了解这个过程

    感谢

        using namespace std;
    
        void ReverseLine(){
           int myInput;
    
           myInput = cin.get();
    
           if (myInput != '\n' && myInput != EOF)
            ReverseLine();
    
           if (myInput != EOF)
            cout.put(myInput);
        }
    
        int main(){
    
           ReverseLine();
           return 0;
    
        }
    

4 个答案:

答案 0 :(得分:4)

也许扩展它会帮助你理解?

void ReverseLine() {
   int myInput = 'a'

   if (myInput != '\n' && myInput != EOF) {
       int myInput = 'b'

       if (myInput != '\n' && myInput != EOF) {
           int myInput = 'c'

           if (myInput != '\n' && myInput != EOF) {
               int myInput = '\n'
               if (myInput != '\n' && myInput != EOF)
                   ReverseLine(); // doesn't get called
               cout.put(myInput);
           }
           if (myInput != EOF)
               cout.put(myInput);
       }

       if (myInput != EOF)
        cout.put(myInput);
   }

   if (myInput != EOF)
    cout.put(myInput);
}

答案 1 :(得分:4)

当您调用ReverseLine时,它会读取一个字符。如果字符不是换行符或EOF,它会再次调用自己(recurses)来读取下一个字符,直到它遇到换行符,此时它会打印刚刚读取的字符,然后返回到ReverseLine,打印出它读取的字符和直到它返回到ReverseLine的初始调用,打印第一个字符读取,然后退出。

答案 2 :(得分:2)

正如Basile所说,

递归很难理解。此示例依赖于局部变量概念。它将到达递归层的末尾,然后从最深的递归调用开始将局部变量myInput打印到第一个。

我们假设您输入“123”。每个缩进都是ReverseInput()的新本地范围。

myInput = 1
ReverseLine()
  myInput = 2
  ReverseLine()
    myInput = 3
    ReverseLine()
      myInput = \n
    prints 3
  prints 2
prints 1

这是以相反的方式做事的常见技巧。

答案 3 :(得分:1)

这真的很简单。 ReverseLine函数在返回之前打印其输出。如果在

中键入* ABC \ n ,则这是事件序列
1. First call to ReverseLine.
1.a **A** is typed.
1.b myInput is not equal to **\n or EOF**, so
   2. Second call to ReverseLine
   2.a **B** is typed.
   2.b myInput is not equal to **\n** or **EOF**, so
      3. Third call to ReverseLine
      3.a **C** is typed.
      3.b myInput is not equal to **\n** or **EOF**, so
         4. Fourth call to ReverseLine
         4.a **\n** is typed.
         4.b myInput is equal to **\n**, so
         4.c ReverseLine is **not** called
         4.d myInput is **not** equal to **EOF**, so
         4.e myInput (**\n**) is printed
         4.f Fourth call to ReverseLine returns
      3.c myInput is **not** equal to **EOF**, so
      3.d myInput (**C**) is printed
      3.e Third call to ReverseLine returns
   2.c myInput is **not** equal to **EOF**, so
   2.d myInput (**B**) is printed
   2.e Second call to ReverseLine returns
1.c myInput is **not** equal to **EOF**, so
1.d myInput (**A**) is printed
1.e First call to ReverseLine returns

然后程序结束。