1

使用递归模板,我想计算n从 0 到n. 即SumUp<10>::n是 55。我想知道,因为我习惯于向下递归(即从n0 到 0)。可以从0到n吗?这是我的尝试:

template<int n> struct SumUp {
    static constexpr int n = n;
};

template<> struct SumUp<0> {
    static constexpr int n = 0 + SumUp<n + 1>::n;  // <- Problem
};

问题是,在第二个模板中,n它是未知的,因此无法编译。

4

1 回答 1

1

“向下”递归已经向上计数。

例如,当你这样做时

int sum(int N)
{
    if (N == 0) return 0;
    return sum(N-1) + N
}

您实际上首先计算 sum(0) 。
然后 sum(1) = sum(0) + 1
然后 sum(2) = sum(1) + 2
然后 sum(3) = sum(2) + 3

我把它写成一个常规函数,但不管语言如何,无论是运行时 c++、模板还是 Visual Basic,都一样。

现在,如果您想反转这一点并向下计数,您需要跟踪目标。

template<int N, int i = 0> struct SumUp {
    static constexpr int n = i + SumUp<N, i+1>::n;
};

template<int N> struct SumUp<N, N> {
    static constexpr int n = N;
};

static_assert(SumUp<1>::n == 1);
static_assert(SumUp<2>::n == 3);
static_assert(SumUp<3>::n == 6);
static_assert(SumUp<4>::n == 10);
  • 第一部分将 SumUp<n, i> 定义为 [i..n] 范围内的整数之和。
  • 第二部分定义了当 n == i 时的停止条件。
于 2020-12-10T00:38:12.300 回答