C++ 为什么在基本情况似乎得到满足后,仍会继续调用此递归函数?

C++ 为什么在基本情况似乎得到满足后,仍会继续调用此递归函数?,c++,recursion,C++,Recursion,在我看来,在打印“hello1”之后,计数器应该降到0,因此应该满足if(counter==0)语句,函数应该结束。为什么不呢?下面是控制流的工作原理。让我们简化函数,只需测试myFunction(1): 解决这个问题的方法是做returnmyfunction(--counter)以下是控制流的工作方式。让我们简化函数,只需测试myFunction(1): 解决这个问题的方法是做returnmyfunction(--counter)使您困惑的输出: ---myFunction(1)-- prin

在我看来,在打印“hello1”之后,计数器应该降到0,因此应该满足if(counter==0)语句,函数应该结束。为什么不呢?

下面是控制流的工作原理。让我们简化函数,只需测试
myFunction(1)


解决这个问题的方法是做
returnmyfunction(--counter)

以下是控制流的工作方式。让我们简化函数,只需测试
myFunction(1)


解决这个问题的方法是做
returnmyfunction(--counter)

使您困惑的输出:

---myFunction(1)--
prints hello1
executes myFunction(0)
    ---myFunction(0)--
    returns
prints 1X
returns
是由以下几行引起的:

hello1
0x

std::cout让您困惑的输出:

---myFunction(1)--
prints hello1
executes myFunction(0)
    ---myFunction(0)--
    returns
prints 1X
returns
是由以下几行引起的:

hello1
0x

std::cout尝试使用缩进跟踪调用

  • 调用myFunction(4)
    • 打印“hello4”
    • 调用myFunction(3)
      • 打印“hello3”
      • 调用myFunction(2)
        • 打印“hello2”
        • 调用myFunction(1)
          • 打印“hello1”
          • 调用myFunction(0)
            • 返回
          • 打印0x
          • 返回
        • 打印1x
        • 返回
      • 打印2x
      • 返回
    • 打印3x
    • 返回

尝试使用缩进跟踪调用

  • 调用myFunction(4)
    • 打印“hello4”
    • 调用myFunction(3)
      • 打印“hello3”
      • 调用myFunction(2)
        • 打印“hello2”
        • 调用myFunction(1)
          • 打印“hello1”
          • 调用myFunction(0)
            • 返回
          • 打印0x
          • 返回
        • 打印1x
        • 返回
      • 打印2x
      • 返回
    • 打印3x
    • 返回

调用递归函数时,它将为该函数创建堆栈帧,并继续为每次调用创建堆栈帧

这些堆栈帧将存储每个调用的状态,直到它返回

第一个调用将创建一个堆栈帧,其中
计数器=4
。然后,它将递减计数器并再次调用该函数,创建一个新的堆栈帧,同时在堆栈上保留旧的堆栈帧。这将继续进行,直到达到基本情况


一旦基本情况返回,则基本情况的调用者将执行下一条指令(在导致基本情况的函数调用之后),即打印它存储在堆栈帧中的
计数器的值。打印后,它将返回,其调用方将打印它存储的值。

当您调用递归函数时,它将为该函数创建堆栈帧,并继续为每个调用创建堆栈帧

这些堆栈帧将存储每个调用的状态,直到它返回

第一个调用将创建一个堆栈帧,其中
计数器=4
。然后,它将递减计数器并再次调用该函数,创建一个新的堆栈帧,同时在堆栈上保留旧的堆栈帧。这将继续进行,直到达到基本情况


一旦基本情况返回,则基本情况的调用者将执行下一条指令(在导致基本情况的函数调用之后),即打印它存储在堆栈帧中的
计数器的值。打印后,它将返回,调用程序将打印它存储的值。

它确实结束了。请记住,在递归结束时,堆栈将展开。你有
std::cout它确实结束了。请记住,在递归结束时,堆栈将展开。您的递归逻辑实际上正在工作。是你的输出被破坏了。它无法打印
4x
这一事实应该是一个提示

问题是,当您将计数器传递到递归调用中并打印它时,您正在递减计数器

试着替换

std::cout << "hello" << counter << std::endl;
myFunction(--counter); //function call
std::cout << counter<< "X" << std::endl;

你应该得到你期望的结果

可以通过将递归计数器设置为常量值来避免这种错误,这样就不会在调用中意外修改它

myFunction(counter - 1)

您的递归逻辑实际上正在工作。是你的输出被破坏了。它无法打印
4x
这一事实应该是一个提示

问题是,当您将计数器传递到递归调用中并打印它时,您正在递减计数器

试着替换

std::cout << "hello" << counter << std::endl;
myFunction(--counter); //function call
std::cout << counter<< "X" << std::endl;

你应该得到你期望的结果

可以通过将递归计数器设置为常量值来避免这种错误,这样就不会在调用中意外修改它

myFunction(counter - 1)

基本大小写返回,然后其调用者继续。递归调用返回后,它会打印
X
内容。要了解类似这样的函数是如何工作的,请假设您是计算机,手动执行函数,在一张纸上跟踪所有变量。基本情况返回,然后调用方继续。递归调用返回后,它会打印
X
内容。要了解类似这样的函数是如何工作的,请假设您是计算机,手动执行函数,并在一张纸上记录所有变量。谢谢,我一直认为return语句意味着停止调用函数。@user3525627,return语句意味着停止调用函数的当前实例。但是递归会创建函数的多个实例。谢谢,我一直以为return语句意味着停止调用函数。@user3525627,return语句意味着停止调用函数的当前实例。但是递归会创建函数的多个实例。@franji1根据您的request@franji1根据您的要求包括退货声明