C++ 递归求解函数中返回void的Fibonacci序列

C++ 递归求解函数中返回void的Fibonacci序列,c++,recursion,void,fibonacci,C++,Recursion,Void,Fibonacci,我的教授要求我们编写一个程序,使用递归来求解斐波那契序列。这很正常,但他要求我们将函数返回为空。我已经在这方面工作了几天,但找不到一个方法来做这件事 我有: void fibonacci(double *n,double *x,double *y,double *result) { if(*n == 1) *result = 0; else if(*n == 2) *result = 1; else fib

我的教授要求我们编写一个程序,使用递归来求解斐波那契序列。这很正常,但他要求我们将函数返回为空。我已经在这方面工作了几天,但找不到一个方法来做这件事

我有:

void fibonacci(double *n,double *x,double *y,double *result) {
     if(*n == 1)
          *result = 0;
     else if(*n == 2)
          *result = 1;
     else
          fibonacci(--n,n,(n-1),(n+(n-1))); }
我做的对吗?我从来没有用过 我不确定以前是否以这种方式使用过参数 如果我在正确的轨道上。由于某种原因,它是 不在递归调用斐波那契时编译,
声明无效的指针添加。谢谢

提示:问题在于:斐波那契-n,n,n-1,n+n-1;甚至就在那里-n。您正在使用指针提示:问题在于:fibonacci-n,n,n-1,n+n-1;甚至就在那里-n。您正在使用指针

编译器是正确的。如果使用指针,则需要在调用中取消对指针的引用

但更简单的解决方案是使用此原型,并将所有代码与之匹配:

void fibonacci(int n, int *result).
我将double替换为int,因为我不明白为什么要使用double来存储整数。 我删除了函数中不使用的x和y。
编译器是对的。如果使用指针,则需要在调用中取消对指针的引用

但更简单的解决方案是使用此原型,并将所有代码与之匹配:

void fibonacci(int n, int *result).
我将double替换为int,因为我不明白为什么要使用double来存储整数。 我删除了函数中不使用的x和y。 不,不是。 首先,要减去指针,使其在-n处浮动,即使编译并运行它,也很容易产生访问冲突。它正确地抱怨类型。函数接受的类型是指针,我打赌您正在传递浮点。

不,不是。 首先,要减去指针,使其在-n处浮动,即使编译并运行它,也很容易产生访问冲突。它正确地抱怨类型。函数接受的类型是指针,我打赌您正在传递浮点数。

首先使用以下内容:

void fibonacci(double n, double & result) {
    if(n == 1)
        result = 0;
    else if(n == 2)
        result = 1;
    else {
        // gotta figure that part out yourself
    }
}
通过将结果声明为引用,您的修改将更改传递的实际参数的值。由于这是C++参考文献,应该是首选的。您仍然可以将n声明为正常值,因为您不想修改它。递归调用现在是您的家庭作业:

首先使用它:

void fibonacci(double n, double & result) {
    if(n == 1)
        result = 0;
    else if(n == 2)
        result = 1;
    else {
        // gotta figure that part out yourself
    }
}

通过将结果声明为引用,您的修改将更改传递的实际参数的值。由于这是C++参考文献,应该是首选的。您仍然可以将n声明为正常值,因为您不想修改它。递归调用现在是您的家庭作业:

由于这是一个家庭作业,我将不提供工作代码,尽管这里有几点:

使用引用比使用指针更简单 您确实需要增加结果,而不是将其设置为0或1。因此,您需要通过引用将赋值为0的int传递给第一个函数调用。 考虑Fn=Fn-1+Fn-2对n≥2的计算公式;fn=0表示n=1,fn=1表示n=2。
由于这是一个家庭作业,我将不提供工作代码,尽管这里有几点:

使用引用比使用指针更简单 您确实需要增加结果,而不是将其设置为0或1。因此,您需要通过引用将赋值为0的int传递给第一个函数调用。 考虑Fn=Fn-1+Fn-2对n≥2的计算公式;fn=0表示n=1,fn=1表示n=2。
我想一定是这样的:

void fibonacci_list()
{
   int count,next=1,prev1=0,prev2;
   printf("1");
   for(count=2;count<=12;count++)
   {
       prev2=prev1;
       prev1=next;
       next=prev1+prev2;
       printf("%d ",next);
   }
   printf("...");
   return;
}

我想一定是这样的:

void fibonacci_list()
{
   int count,next=1,prev1=0,prev2;
   printf("1");
   for(count=2;count<=12;count++)
   {
       prev2=prev1;
       prev1=next;
       next=prev1+prev2;
       printf("%d ",next);
   }
   printf("...");
   return;
}

他说我们的测试用例将有非常大的数量,他希望我们使用double,因为这一点。我认为把n变成一个整数,结果变成一个double*,结果会变得非常大。谢谢你的帮助!Double不适合存储非常大的整数。。。你可以使用long-long或类似的东西。哦,我认为你的程序堆栈在达到无符号或有符号整数的最大值之前会爆炸。这不是真的。例如,F100不会威胁任何大于缩略图的系统上的堆栈,但结果不适合64位整数。double将至少近似于结果。事实上,如果你只需要一个近似的双精度结果,那么递归计算就没有什么意义了。好吧,我考虑的是参数,不是结果,我的错。他说我们的测试用例会有非常大的数字,他希望我们使用双精度,因为这一点。我认为把n变成一个整数,结果变成一个double*,结果会变得非常大。谢谢你的帮助!Double不适合存储非常大的整数。。。你可以使用long-long或类似的东西。哦,我认为你的程序堆栈在达到无符号或有符号整数的最大值之前会爆炸。这不是真的。例如,F100不会威胁任何大于缩略图的系统上的堆栈,但结果不适合64位整数。double将至少近似于结果。但事实上,如果一切顺利的话
你需要的是一个近似的双重结果,然后递归计算它就没有什么意义了。好吧,我考虑的是参数,不是结果,我的错。+1只是为了提示,而不是为了用整个代码破坏学生+1仅为提示,不要用整个代码破坏该学生这是一个更复杂的解,结果等于0/1。因为我不能提供家庭作业问题的完整代码,所以我不会再多说了,但请自己试一试:谢谢你的帮助,是的,我更愿意找出答案。我这么问是因为我的参数开始变得疯狂,我想我把事情复杂化了。谢谢大家!这是一个更复杂的解,结果等于0/1。因为我不能提供家庭作业问题的完整代码,所以我不会再多说了,但请自己试一试:谢谢你的帮助,是的,我更愿意找出答案。我这么问是因为我的参数开始变得疯狂,我想我把事情复杂化了。谢谢大家!我写一个有效且不返回void的。2,修改该函数,将其返回值写入调用者提供的位置,而不是返回它。谢谢大家帮我理清思路,我已经把事情复杂化了。我要写一个有效的,不会无效的。2,修改该函数,将其返回值写入调用者提供的位置,而不是返回它。谢谢大家帮我理清思路,我已经把事情复杂化了。你说得很对,我花了很长时间才明白,但你所说的渐进式方式是最好的方式,非常感谢你的帮助和洞察力。现在我要计算它的运行时间和增长率,有趣!你说得很对,我花了很长时间才看到,但你所说的渐进式方法是最好的方法,非常感谢你的帮助和洞察力。现在我要计算它的运行时间和增长率,有趣!