首页 > 解决方案 > 谁能解释一下这个程序的递归逻辑?

问题描述

#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。有人可以解释这种行为吗?

标签: c++templatesrecursionoutput

解决方案


让我们看 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反而下降了。


推荐阅读