c++ - 谁能解释一下这个程序的递归逻辑?
问题描述
#include <iostream>
template <int N>
{
class P
{
public:
static void print()
{
P<N-1>::print();
std::cout << N << std::endl;
}
};
template<>
class P<1> {
public:
static void print()
{
std::cout << 1 << std::endl;
}
};
int main() {
const int N = 10;
P<N>::print();
return 0;
}
以下代码的输出是:
1
2
3
4
5
6
7
8
9
10
程序首先从 10 倒数到 1,然后一旦 N 值变为 1,就会调用 P<1>::print。我不明白在这个电话之后,N 值如何增加 1 直到 N=10。有人可以解释这种行为吗?
解决方案
让我们看 3 作为一个较小的例子:
P<3>::print calls P<2>::print
. P<2>::print calls P<1>::print
. . P<1>::print prints 1
. . Then returns to P<2>::print
. Then prints 2
. Then returns to P<3>::print
Then prints 3
Then returns to main
因为打印是在递归调用之后放置的,所以打印发生在从函数返回时的堆栈上,而不是在调用函数时的堆栈下。因此,内部的先打印,外部的最后打印。如果交换两个语句,则打印顺序相反。
N
上升,因为每个P<N>::print
都在返回P<N+1>::print
。在进去的路上,N
反而下降了。
推荐阅读
- c++ - gtkmm Append_column(TreeViewColumn) 什么都不显示
- php - PHP/Laravel - Chartjs 内爆不起作用
- javascript - Reactjs绑定问题
- symfony - 如何在 Symfony 中覆盖模型中的任何字段
- php - 允许额外的 URL 段
- vba - 如何保护 ms 访问前端不增加大小
- itext - 真正裁剪 PDF 文件
- sql - 多行到列 (SQL)
- c# - 如何将 UI 加入 WPF 中的主线程
- scala - Scala,类型不匹配;找到:(Double, Option[String]) ⇒ Double required: ((Double, Option[String]))