def recorrência_linear(valores_base,coeficientes,fun=lambda _:0,até=20):
    """
    recorrência_linear([base_0,base_1,...,base_{k-1}],[a_1,a_2,...,a_k], até)
    é a função dada pela recorrência

    n = 0   => F(n) = base_0
    n = 1   => F(n) = base_1
    ...
    n = k-1 => F(n) = base_{k-1}
    n >= k  => F(n) = [(a_1 * F(n-1)) + (a_2 * F(n-2)) + ... + (a_k * F(n-k))] + fun(n)

    Os resultados de F(0), F(1), ... , F(até) são impressos.
    """
    assert len(coeficientes) == len(valores_base), "Forneça uma quantidade de casos bases igual à ordem da recorrência!"
    contagem = len(coeficientes)-1
    L = len(coeficientes)
    calculados = valores_base.copy()
    for i,val in enumerate(calculados[:até]):
        print(f'{i} -> {val}\t\t[base]')
    calculados = list(reversed(calculados))
    while contagem < até:
        contagem += 1
        novo = fun(contagem)
        for coef,val in zip(coeficientes,calculados):
            novo += coef*val
        calculados[0], calculados[1:] = novo, calculados[:-1]
        print(f'{contagem} -> {calculados[0]}',end='\t\t')
        if L > 1 and calculados[1] != 0:
            print(f'[{calculados[0]/calculados[1]}]',end='')
        print()
