【问题标题】:Can anyone please Explain the recursion logic of this program? [closed]谁能解释一下这个程序的递归逻辑? [关闭]
【发布时间】:2021-10-30 06:03:42
【问题描述】:
#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::print 被调用。我不明白在这个电话之后,N 值如何增加 从 1 到 N=10。有人可以解释这种行为吗?

【问题讨论】:

  • 你能确定P&lt;10&gt;::print()会做的第一件事吗?
  • 如果您将此问题简化为调用P&lt;2&gt;::print(),您可能会发现很容易单步执行导致1 2 的每一行代码。

标签: c++ templates recursion output


【解决方案1】:

你能看懂这个程序吗?

void p10_print() {p9_print(); std::cout << 10 << std::endl;}
void p9_print() {p8_print(); std::cout << 9 << std::endl;}
void p8_print() {p7_print(); std::cout << 8 << std::endl;}
void p7_print() {p6_print(); std::cout << 7 << std::endl;}
void p6_print() {p5_print(); std::cout << 6 << std::endl;}
void p5_print() {p4_print(); std::cout << 5 << std::endl;}
void p4_print() {p3_print(); std::cout << 4 << std::endl;}
void p3_print() {p2_print(); std::cout << 3 << std::endl;}
void p2_print() {p1_print(); std::cout << 2 << std::endl;}
void p1_print() {std::cout << 1 << std::endl;}
int main() {
    p10_print();
    return 0;
}

这是同一个程序。模板使编译器为您创建所有这些函数。

如果您仍然无法理解:p2_print() 直到 after p1_print() 返回时才打印 2。 p2_print() 调用 p1_print() 打印 1,然后打印 2。p3_print() 调用 p2_print(),打印 1 2,然后打印 3。以此类推。

【讨论】:

    【解决方案2】:

    让我们把 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&lt;N&gt;::print 都返回 到P&lt;N+1&gt;::print。在进来的路上,N 反而下降了。

    【讨论】:

      猜你喜欢
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 2017-05-25
      相关资源
      最近更新 更多