Główny błąd to przekazywanie argumentu przez referencję do tej funkcji, następnie wywoływanie jej w ten sposób: rekurencja(liczba - 1).
Wynik działania (liczba - 1) jest stały (const). Liczby w C++ nie są zmiennymi, tylko stałymi. Nie możemy przekazać stałej do funkcji przez referencję, której argument nie jest zadeklarowany jako const reference.
Aby rozwiązać ten problem należy usunąć znak & w deklaracji argumentu funkcji rekurencja, lub zadeklarować ten argument jako const int &liczba.
Można się jeszcze przyczepić do deklaracji pierwszej zmiennej w programie: int liczba=5; Nie wchodzi ona w zakres ważności zmiennych w funkcji rekurencja. Jest ona nadpisywana przez argument tej funkcji o tej samej nazwie (liczba).