C数-Fibonacci言語列再帰的な実装

フィボナッチ数列の再帰的な実装

  • :フィボナッチ数列を定義する最初の
    フィボナッチ数列は、Aシリーズを指す:1,1,2,3,5,8,13,21,34、......数学において、フィボナッチ列を以下のようにメソッド定義再帰:F(1)= 1、F(2)= 1、F(N-)= F(N - 1)+ F(N - 2)(N-≥3、N-∈N *。。。。
    フィボナッチシリーズプログラムの中で非常に簡単です達成し、彼は典型的な再帰的なアルゴリズムが現実的であることが可能です。
  • のは、再帰共通文言を見てみましょう:
int fibo(int n)
{
        if(n == 1 || n == 2)
                return 1;
        return fibo(n-1)+fibo(n-2);

}
int main()
{
        int n,result;
        printf("请输入:");
        scanf("%d",&n);
        result = fibo(n);
        printf("%d\n",result);
}

再帰的なコードは簡単ですが、あなたには、いくつかの最適化をしない場合、それは、スタックオーバーフローを起こしやすいです。以上のメモリを大量に消費が達成される、ときN> 2ので、FIBO機能は、2のn倍が元のオープンに1つの復帰ずつ、その後、値を返すようになったと機能し始める必要が自分自身を呼び出します。必要なnの値が非常に大きい場合、それは通話記録の数百または数千を保存する必要があり、それは「スタックオーバーフロー」エラー(スタックオーバーフロー)になりやすいです。

  • しかし、我々はもう少し最適化された実装を行うことができます-末尾再帰
    関数が戻るには、自分自身を自分自身を呼び出し、そして時に、return文が式を含むことができない、という末尾再帰手段を。このように、コンパイラまたはあなたは、最適化末尾再帰に自分自身への再帰呼び出しを行うことができ、インタプリタ、唯一のスタックフレームを占有回数に関係なく、スタックオーバーフローの状況が発生しません。
    一般的には、唯一の通話記録があるので、それは決して「スタックオーバーフロー」エラーが発生しました。
    最適化された再帰関数:
int fibo(int n,int i,int j)
{
        if(n ==1 || n ==2)
                return j;
        return fibo(n-1,j,j+i);
}

int main()
{
        int n,result;
        printf("请输入:");
        scanf("%d",&n);
        result = fibo(n,1,1);
        printf("%d\n",result);
}

FIBO関数が自分自身を呼び出したときにその結果、我々はない一つの再帰1の終わりに、戻り値を持つようになったし、元の関数の戻り値に戻ります。末尾再帰的な実装は、コンパイラは、メモリの消費量を大幅に節約しない私の母は、もはやスタックオーバーフローしなければならない私たちを助けることができます!

おすすめ

転載: www.cnblogs.com/tansss/p/12509879.html
おすすめ