Usiłowałem wczoraj opanować funkcje rekurencyjne i postanowiłem przecwiczyć temat generując ciąg Fibonacciego. Po kilku nieudanych próbach wygenerowałem ciąg liczb. Ok, najpierw kod:
Kod: Zaznacz cały
#include<iostream>
using namespace std;
unsigned int fib = 0;
void fibonaci(unsigned int val);
int main(void)
{
fibonaci(fib);
system("pause");
return 0;
}
void fibonaci(unsigned int val)
{
static unsigned int last_value;//poprzednia wartosc "val"
unsigned int temp = val;
cout << val << endl;//wyswietlenie aktualnych danych
val += last_value;//dodaję poprzednią wartość do obecnej
last_value = temp;//odtwarzam wartość val i od tej pory jest jako poprzednia
//zeby wygenerowanie ciągu doszło do skutku, nalezy zwiększyć wartość o jeden, gdy val == 0
if (!val) val++;
if (val > 0xFFFFFFF0) return;
fibonaci(val);
}
Nie jest to nic wyrafinowanego, z C++ też ma niewiele wspólnego. Problemem jest przepełnienie stosu podczas próby wygenerowania ciągu kończącego się w okolicach limitu dla unsigned int. I tu pytanie... W jaki sposób ustalić co przepełniło stos? Odkłądane adresy powrotu z funkcji (liczyłem na to, że funkcja rekurencyjna będzie ogonową) czy coś innego? Mam pewne podejrzenia, że kopie argumentu val odkładane sa na stos, ale w takim razie jak przekazać zaktualizowany argument do kolejnego wywołania funkcji rekurencyjnej?
Przychodzi mi na myśl wskaźnik do zmiennej globalnej, ale to by się kłóciło z sugestią, by ograniczać ilość zmiennych globalnych