我试图将斐波那契级数的元素存储在数组中,该数组位于函数内部,在通过"return arr“从函数返回后,我的堆栈框架被销毁,并且我无法在main函数中接收值。我只想使用递归和从main函数打印,这些都是我的条件。
#include <stdio.h>
int *fib(int *num, int *first, int *second, int i, int *arr);
int main()
{
int num;
printf("Enter any number : \n");
scanf("%d", &num);
int first = 0, second = 1, i = 0;
int arr[num];
int *result = fib(&num, &first, &second, i, arr);
for (int i = 0; i < num; i++)
printf("%d ", result[i]);
}
int *fib(int *num, int *first, int *second, int i, int *arr)
{
int temp;
if (*first == 0)
printf("%d ", *first);
if (*num < 0)
{
if (*second == 1)
printf("%d ", *second);
temp = *first - *second;
*first = *second;
*second = temp;
if (*second > *num && *second < -*num)
{
*(arr + i) = *second;
return fib(num, first, second, i++, arr);
}
else
return arr;
}
else
{
temp = *first + *second;
*first = *second;
*second = temp;
if (*second >= *num + 3)
return arr;
else
{
*(arr + i) = *second;
return fib(num, first, second, i++, arr);
}
}
printf("\n");
}发布于 2019-03-27 20:41:54
你不能这么做。
您试图与堆栈帧是什么的定义作斗争,但您正在失败。
你永远都会输!
相反,根据语言的规则和规范,正确地构建您的程序,以便以您需要的方式传递数据。
发布于 2019-03-27 22:18:51
你完全可以在不保护函数栈框的信息的情况下实现你想做的事情,因为我不认为你的错误与此有任何关系。也就是说,与迭代方法相比,使用斐波那契数进行递归是没有意义的,它只会在不需要的时候发送额外的堆栈。
我从Jabberwocky的回答中获得了灵感,并用“递归”做了一个例子,尽管它最终只是一个花哨的for循环。
#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;
}
}这会将所有值存储到在main中分配的arr中,因此删除stackframes没有任何影响。fib函数即使在递归时也不需要返回任何东西,因为它有数组指针,可以直接更改数组的值。当然,需要更多的错误检查,但我认为这足以让人理解这个想法。
发布于 2019-03-27 21:07:47
有点离题,但您可能只是想要这样:
#include <stdio.h>
void fib(int num, int *arr);
int main()
{
int num;
printf("Enter any number : \n");
scanf("%d", &num);
int arr[num] = { 0, 1 } ;
fib(num, arr);
for (int i = 0; i < num; i++)
printf("%d ", arr[i]);
}
void fib(int num, int *arr)
{
for (int i = 0; i < num; i++)
{
arr[i + 2] = arr[i] + arr[i + 1];
}
}在这里使用递归是非常没有意义的。这是未经测试的代码,可能有bug。
https://stackoverflow.com/questions/55377363
复制相似问题