diff --git a/math/double_factorial.cpp b/math/double_factorial.cpp index 8e5ffcefa..72feda60c 100644 --- a/math/double_factorial.cpp +++ b/math/double_factorial.cpp @@ -1,8 +1,9 @@ /** * @file - * @brief Compute double factorial: \f$n!!\f$ + * @brief Compute [double + * factorial](https://en.wikipedia.org/wiki/Double_factorial): \f$n!!\f$ * - * Double factorial of a non-negative integer n, is defined as the product of + * Double factorial of a non-negative integer `n`, is defined as the product of * all the integers from 1 to n that have the same parity (odd or even) as n. *
It is also called as semifactorial of a number and is denoted by * \f$n!!\f$ @@ -32,10 +33,38 @@ uint64_t double_factorial_recursive(uint64_t n) { return n * double_factorial_recursive(n - 2); } -/// main function -int main() { - uint64_t n; - std::cin >> n; - assert(n >= 0); - std::cout << double_factorial_iterative(n); +/** Wrapper to run tests using both recursive and iterative implementations. + * The checks are only valid in debug builds due to the use of `assert()` + * statements. + * \param [in] n number to check double factorial for + * \param [in] expected expected result + */ +void test(uint64_t n, uint64_t expected) { + assert(double_factorial_iterative(n) == expected); + assert(double_factorial_recursive(n) == expected); +} + +/** + * Test implementations + */ +void tests() { + std::cout << "Test 1:\t n=5\t..."; + test(5, 15); + std::cout << "passed\n"; + + std::cout << "Test 2:\t n=15\t..."; + test(15, 2027025); + std::cout << "passed\n"; + + std::cout << "Test 3:\t n=0\t..."; + test(0, 1); + std::cout << "passed\n"; +} + +/** + * Main function + */ +int main() { + tests(); + return 0; }