Вы определенно можете достичь того, что вы хотите сделать, не защищая информацию на стеке фреймов функции, так как я не верю, что ваша ошибка как-то связана с этим.С учетом сказанного, рекурсия с числами Фибоначчи бессмысленна по сравнению с итеративным подходом, она просто заканчивается спамом дополнительных стековых фреймов, когда ни один из них не нужен.
Я черпал вдохновение из ответа Джаббервоки и привел пример с «рекурсией»хотя в конечном итоге это просто замысловатый цикл.
#include <stdio.h>
void fib(int num, int *arr, int pos);
int main()
{
int num;
printf("Enter any number : \n");
scanf("%d", &num);
int arr[num];
if (num > 1) {
arr[0] = 0 ;
arr[1] = 1 ;
}
int pos = 2;
fib(num, arr, pos);
for (int i = 0; i < num; i++)
printf("%d ", arr[i]);
}
void fib(int num, int *arr, int pos)
{
if (pos < num && pos > 1)
{
arr[pos] = arr[pos - 2] + arr[pos - 1];
fib(num, arr, pos + 1);
}
else {
return;
}
}
Он сохраняет все значения в arr, который размещен в main, поэтому удаление стековых кадров не имеет никакого эффекта.Функция fib, даже когда рекурсивная, не должна ничего возвращать, потому что она имеет указатель массива и может напрямую изменять значения массива.Конечно, необходима дополнительная проверка ошибок, но я думаю, что этого достаточно, чтобы донести идею.