递归示例中的混淆
Confusion in Recursion example
本文关键字:递归 更新时间:2023-10-16
我的讲义中有一个递归的例子
void print(int n)
{
if (n<1) {return;}
print(n-1);
cout<<n;
}
我尝试在 DEV C++ 中实现此代码,在调试模式下,我发现打印函数一次又一次地调用自己,直到n=0
。然后它转到cout<<n
并开始在n
中增加并显示输出1 2 3 4 5
我不明白为什么它显示此输出,在我看来,它应该只在输出中显示0
。
程序的执行(从上到下):
print (5)
if (5<1) {return;} // <-- False; going on
print (5-1) // print (4)
if (4<1) {return;} // <-- False; going on
print (4-1) // print (3)
if (3<1) {return;} // <-- False; going on
print (3-1) // print (2)
if (2<1) {return;} // <-- False; going on
print (2-1) // print (1)
if (1<1) {return;} // <-- False; going on
print (1-1) // print (0)
if (0<1) {return;} // <-- True; returning
cout << 1;
cout << 2;
cout << 3;
cout << 4;
cout << 5;
这很简单。它正在展开堆栈并打印存储在堆栈上的n的本地副本。让我们一步一步来做:打印(3);- 3 不小于 1,因此此函数不返回- 然后在下一行中,此函数调用自身,但参数递减那么会发生什么呢?下一个堆栈帧是用 n-1 值创建的,该值被复制,然后故事是相同的,它调用 print 直到 n = 0;每次复制N!因此,在本地n值上具有以下堆栈:
1 <--下一个调用是 print(0),它返回不执行任何操作
阿拉伯数字
3 <--我们从这里开始
因此,然后堆栈被展开:在打印(n-1)后进入下一行,在顶部帧中n == 1,然后当下一个堆栈帧展开并且本地n副本== 2,然后是3,发送到cout的内容。
现在清楚了吗?
每次调用print()
局部变量(如 n
)的当前值都会与调用它的函数中的位置一起存储在堆栈(调用堆栈)上。
然后,当您从函数返回时,将从调用堆栈中检索以前的局部变量,并在调用函数后立即返回到函数的位置。直到你return
你叫多少次。
因此,当您调用print()
时,n
的值会下降,因为每次您调用print()
并将n - 1
设置为新参数n
时,这些值都会被存储,直到您最终到达return;
并且这些值开始以与它们放置在那里相反的顺序从调用堆栈中弹出,直到您返回与您调用的次数一样多。
相关文章:
- 通过递归进行因子分解
- 递归函数计算序列中的平方和(并输出过程)
- 使用递归的数组的最小值.这是怎么回事
- 递归列出所有目录中的C++与Python与Ruby的性能
- 递归计数给定目录的文件和所有目录
- 如何在BST的这个简单递归实现中消除警告
- C++:正在检查LinkedList中的回文-递归方法-错误
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 递归无序映射
- TSP递归解的迭代形式
- 如何在Elixir中调用递归函数并行
- 返回递归调用和仅递归调用的区别
- 数组元素打印的递归方法
- 使用递归时获取变量的奇怪值
- 如何在C++中递归地按相反顺序打印集合
- 到连接组件算法的问题(递归)
- 如何使用递归打印修改后的星号三角形图案
- 使用递归模板动态分配的多维数组
- 递归函数有效,但无法记忆
- 包含模板文件的递归会导致编译失败