フィボナッチ数列リード
フィボナッチ数列は広く使用されており、ここには記載されていません。
C言語コードの実装-再帰
同時に、多くの種類のコード実装メソッドがあります。ここでは、C言語での実装メソッドのみを示します。
中心となるアイデアは、「再帰」を使用することです。
//C语言:递归实现 Fibonacci数列
//输入n,求 Fibonacci[n] (在数学中,常常写作Fibonacci(n) )
#include <stdio.h>
#define N 100
long Fibonacci(int n);
int main(){
int n;
long k;
printf("请输入n:");
scanf("%d",&n);
k=Fibonacci(n);
putchar('\n');
printf("Fibonacci(%d)=%ld\n",n,k);
return 0;
}
long Fibonacci(int n){
if(n==1||n==2)
{
return 1;
}
else{
return Fibonacci(n-1)+Fibonacci(n-2);
}
}
いくつかのテスト:
次の例では、データが大きすぎると、エラーが発生するはずです。精度の問題、表現範囲の問題が原因です。
正の解決策:Fibonacci(50)= 12 586 269 025
そして、以下の時間のかかることに注意してください。これも非常に長いです。
教科書を見るとlong int
、表現の範囲は
-2 147 483 648 ~ 2 147 483 647
(10桁)であることがわかります。そして、上記のフィボナッチ(50)の結果は11桁です、もちろんそれはうまくいかないでしょう!
また、次の結果は正しくありません。
これも表現範囲の問題が原因です。
正しい解決策:Fibonacci(49)= 7 778 742 049以下の結果を
テストしてみましょう正确
。↓↓↓
ローカルテストでは、46番目の項目であるFibonacci(46)は、longintがテストできる最大値である必要があります。
8.822秒かかりました。
C言語コードの実装-非再帰的
//非递归实现Fibonacci数列
#include <stdio.h>
long Fibonacci(int n);
int main(){
int n;
long k;
printf("请输入n:");
scanf("%d",&n);
k=Fibonacci(n);
putchar('\n');
printf("Fibonacci(%d)=%ld\n",n,k);
return 0;
}
//非递归实现Fibonacci数列
long Fibonacci(int n)
{
int n1=1,n2=1;
int t=0,i=0;
if (n<3)
{
//即如果n为1或者2的话,那么Fibonacci(1) = Fibonacci(2)=1
return 1;
}
else //下面举个例子,便于理解:
{
//例如n为6,我们知道Fibonacci数列为:1、1、2、3、5、8...
//此时对于下面for循环,则i=0,i<4。开始时n1和n2都是1,即第一和第二项
for(i=0; i<n-2; i++)
{
t = n1 + n2; //t就是数列第三项,为 1+1=2
n1 = n2; //注意:令n2赋值给n1,即n1和n2分别 后移一位,这时新的n1即第二项F(2)=1
n2 = t; //这里同理,t作为新的n2,即F(3)=2
//依次类推,即可实现求每一项,然后得到 Fibonacci(6),即 Fibonacci(n)
}//注意:如果还不好理解,那么动笔写一下就会理解啦!
return t;
}
}
コメントをはっきりと書いたと思います。わからない場合は、次の写真を見てください。よく理解されているはずです。
次に、いくつかのテスト
があります。上記の結果が正しいことがわかります。
(さらに、フィボナッチ数列の最初の100項目については、资源
直接ダウンロードできるtxt形式で ""にアップロードします。)
どちらを選ぶかは、初心者の方にはわかりやすい再帰的な方法をお勧めします。