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