TheAlgorithms-C-Plus-Plus/math/double_factorial.cpp

42 lines
991 B
C++
Raw Normal View History

2020-05-27 21:21:54 +08:00
/**
* @file
* @brief Compute double factorial: \f$n!!\f$
*
2020-05-27 21:21:54 +08:00
* 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.
2020-05-28 00:55:03 +08:00
* <br/>It is also called as semifactorial of a number and is denoted by
* \f$n!!\f$
2020-05-27 21:21:54 +08:00
*/
2020-05-27 21:21:54 +08:00
#include <cassert>
#include <iostream>
/** Compute double factorial using iterative method
*/
uint64_t double_factorial_iterative(uint64_t n) {
2020-05-27 21:21:54 +08:00
uint64_t res = 1;
for (uint64_t i = n;; i -= 2) {
if (i == 0 || i == 1)
return res;
2020-05-27 21:21:54 +08:00
res *= i;
}
return res;
}
/** Compute double factorial using resursive method.
* <br/>Recursion can be costly for large numbers.
*/
uint64_t double_factorial_recursive(uint64_t n) {
if (n <= 1)
return 1;
2020-05-27 21:21:54 +08:00
return n * double_factorial_recursive(n - 2);
}
2020-05-27 21:21:54 +08:00
/// main function
int main() {
2020-05-28 00:55:03 +08:00
uint64_t n;
2020-05-27 21:21:54 +08:00
std::cin >> n;
assert(n >= 0);
std::cout << double_factorial_iterative(n);
}