// Cuántas llamadas hace Fibonacci con y sin memoización, y qué subproblemas repite.
#include <iomanip>
#include <iostream>
#include <vector>

#include "fibonacci.h"

int main() {
    std::cout << " n          F(n)   sin memoizar   memoizando\n";
    for (int n : {5, 10, 20, 30, 40}) {
        long long plain_calls = 0;
        std::vector<long long> times(static_cast<std::size_t>(n) + 1, 0);
        const long long value = fib_plain(n, plain_calls, times);
        long long memo_calls = 0;
        std::vector<long long> memo(static_cast<std::size_t>(n) + 1, -1);
        fib_memo(n, memo, memo_calls);
        std::cout << std::setw(2) << n << std::setw(14) << value << std::setw(15) << plain_calls
                  << std::setw(13) << memo_calls << '\n';
    }

    long long calls = 0;
    std::vector<long long> times(11, 0);
    fib_plain(10, calls, times);
    std::cout << "\nfib(10): cuántas veces se calcula cada subproblema\n";
    for (std::size_t k = 0; k <= 10; k++) {
        std::cout << "  F(" << k << "): " << times[k] << '\n';
    }

    std::cout << "\nF(90) con tabla:         " << fib_table(90) << '\n';
    std::cout << "F(90) con dos variables: " << fib_two_vars(90) << '\n';
}
