“向下”递归已经向上计数。
例如,当你这样做时
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 时的停止条件。