#include #include #include const double RATIO_THRESHOLD = 0.000001; const unsigned int DISPLAY_ITERATIONS = 20; /* @param series: unsigned int, the n-bonacci series "degree" (2 -> fib, 3 -> trib) @param n: unsigned int, the term to find @return long: the nth term of the series-degree n-bonacci series */ long nbonacci(unsigned int series, unsigned int n) { if (n <= series) return 1; long sum = 0; for (unsigned int i = 1; i <= series; ++i) sum += nbonacci(series, n - i); return sum; } /* @param title: std::string, the name of the series @param series: unsigned int, the degree of the n-bonacci series @return void: print the ratio of the series to stdout */ void computeNbonacciRatio(std::string title, unsigned int series) { unsigned int i = series+1; long prev = 1; long curr = nbonacci(series, i); // The first series numbers are one's double currRatio = static_cast(curr) / static_cast(prev); double prevRatio; do { prevRatio = currRatio; prev = curr; curr = nbonacci(series, ++i); currRatio = static_cast(curr) / static_cast(prev); } while (std::abs(currRatio - prevRatio) > RATIO_THRESHOLD); // i-1 because the nth number in the sequence corresponds with the (n-1)'th iteration std::cout << title << " ratio approches " << currRatio << " after " << i-1 << " iterations." << std::endl; } int main() { std::vector names; names.push_back("Fibonacci"); names.push_back("Tribonacci"); names.push_back("Fourbonacci"); names.push_back("Fivebonacci"); unsigned int i; for (i = 0; i < names.size(); i++) { std::cout << "--- " << names.at(i) << " ---" << std::endl; for (unsigned int n = 1; n < i+2; n++) std::cout << "1 "; for (unsigned int n = i+2; n <= DISPLAY_ITERATIONS; n++) std::cout << nbonacci(i+2, n) << " "; std::cout << std::endl; } std::cout << std::endl; for (i = 0; i < names.size(); i++) computeNbonacciRatio(names.at(i), i+2); return 0; }