なぜそうなるのか以前証明したので書きます。。
Proof)
Fibonacci数列は、1つ前の数と2つ前の数を足した数の列です。
こんな感じです。
1 1 2 3 5 8 13 21 ・・・
なので、n番目のFibonacci数列の数をFnとすると、Fn+2=Fn+1+Fnとなる。
両辺をFn+1で割ると、Fn+2/Fn-1=1+1/(Fn+1/Fn)
よって、これらの数が1つの値に収束するとすれば、x = 1+1/xというようにできます。
両辺にxをかけてx^2=x+1よってついに
x2-x-1=0
x = 1+√5/2
x>0よりx=φ
□
それではソースを・・・
再帰関数を利用してみたためかなり効率が悪く計算に時間がかかりますが・・・
#include
int fibonacci(int num){
int x;
if(num==1)return 1;
if(num>=2)return fibonacci(num-1)+fibonacci(num-2);
}
int main(){
int num;
printf("Fibonacci数列を利用して、黄金数の近似値を求める\n\n");
while(1){
printf("自然数を入力してください。\n数値が大きいほどより黄金数に近い数値が出せます。\n(ただし、40を超える程度の数値になると、かなり時間がかかるので、大きくても40程度がいいでしょう。)\n");
scanf("%d",&num);
printf("%.20lf\n\n\n\n",(double)fibonacci(num)/fibonacci(num-1));
}
return 0;
}
1.61903398874820358900となり、
小数点以下11ケタまで正しい値を出せました。