1

私の教授は、再帰を使用してフィボナッチ数列を解くプログラムを作成するように依頼しました。これはすべてごく普通のことですが、彼は私たちの関数がvoidを返すように私たちに頼んでいます。私はこれで数日間働いていますが、これを行う方法を見つけることができません。

私は持っています:

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))); }

私がしていることは正しいですか?私はこれまでそのような方法でパラメータを使用する必要はなく、正しい方向に進んでいるかどうかはわかりません。何らかの理由で、フィボナッチへの再帰呼び出しでコンパイルされておらず、無効なポインターの追加が示されています。ありがとう!

4

6 に答える 6

4

ヒント:問題はそこにあります:fibonacci(--n,n,(n-1),(n+(n-1)));あるいはただそこにあり--nます。ポインタを使用しています

于 2010-09-23T09:44:41.777 に答える
3

コンパイラは正しいです。ポインターを使用する場合は、呼び出しでポインターを逆参照する必要があります。

しかし、より簡単な解決策は、代わりにこのプロトタイプを使用することです(そしてすべてのコードをそれに一致させます):

void fibonacci(int n, int *result).
  • 整数を格納するためにdoubleを使用する理由がわからないため、doubleをintに置き換えました。
  • 関数で使用しないxとyを削除しました。
于 2010-09-23T09:45:17.347 に答える
0

いいえそうではありません。まず第一に、floatへのポインター(--n)を減算しているため、(コンパイルして実行したとしても)アクセス違反が発生する可能性があります。タイプについては正しく文句を言います。関数が受け入れる型はポインターであり、floatを渡しているに違いありません。

于 2010-09-23T09:47:42.870 に答える
0

これを最初に使用します。

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

参照として宣言resultすることにより、変更により、渡された実際のパラメーターの値が変更されます。これはC++であるため、参照を優先する必要があります。n変更したくないので、通常の値として宣言することもできます。再帰呼び出しは今あなたの宿題です:)

于 2010-09-23T09:55:55.300 に答える
0

これは宿題なので、ここではいくつかのポイントがありますが、動作するコードは提供しません。

  1. 参照の使用は、ポインターの使用よりも簡単です
  2. 結果を0または1に設定するのではなく、実際に増やす必要があります。したがって、値0が割り当てられたintを参照して、最初の関数呼び出しに渡す必要があります。
  3. 次の式を考えてみましょう。すべてのn>2に対してf(n)= f(n-1)+ f(n-2)。n = 1の場合はf(n)= 0、n = 2の場合はf(n)=1。
于 2010-09-23T09:56:55.853 に答える
0

私はそれがこのようでなければならないと思います:

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;
}
于 2013-12-24T15:18:51.440 に答える