プロが教える店舗&オフィスのセキュリティ対策術

フィボナッチ数列の項は、その直前の連続する二つの項の和である。
f( n ) = f( n - 1 ) + f( n - 2 )
但し、 f(0) = 0, f(1) = 1 である。  
フィボナッチ数列の連続する項の差の比
z = { f( n - 1 ) - f( n - 2 ) }/ { f( n ) - f( n - 1 ) }
は、 n が大きくなれば、ある値に収束する。この値の近似値を求める プログラムを書き、その値を示せ。この値は黄金分割比と呼ばれる。
フィボナッチ数列は関数 fibonacci を作って求め、項は配列に表せ。まず 30 項まで求め、黄金分割比の値が収束していく様子を出力して確かめよ。収束判定のために定数 dif = 1.0 e -6 を宣言し、 連続する z の差の絶対値が dif 以下になったとき、収束したとして計算を終了するプログラムを作りなさい。


この問題について質問なんですが
コンパイルはできるんだけど、結果がうまく表示されません。 すみませんがわかる方教えてくれませんか?

program pe1_2(input,output);
const dif = 1.0e-6;
var i,m, g : integer;
f, z,q : array [0..500] of real;
function fibonacci(n: integer):integer;
begin
if (n >=0) and (n <=1) then fibonacci:=n
else fibonacci:=fibonacci(n-1)+fibonacci(n-2);
end; { fibonacci }
begin
f[i]:=fibonacci(i);
writeln('30項まで求めます ');
for i :=1 to 30 do
begin
writeln('f(',i:2,')=',f[i]:1);
end;
write('m=');
readln(m);
for i:= 3 to m do
repeat z[i]:=(f[i-1]-f[i-2])/(f[i]-f[i-1]);
until dif >= z[i]-z[i-1];
writeln(z[i]);
{writeln('z(',i:3,')=',z[i]:1,','); }
end.

A 回答 (2件)

f[i]:=fibonacci(i);がfor loopの外に出ちゃってますね。


-- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< --
program pe1_2(input,output);
const dif = 1.0e-6;
var i: integer;
f: array [0..500] of real;

function fibonacci(n: integer):integer;
begin
if (n >=0) and (n <=1) then fibonacci:=n
else fibonacci:=fibonacci(n-1)+fibonacci(n-2);
end; { fibonacci }

begin
writeln('30項まで求めます ');
for i :=1 to 30 do
begin
f[i]:=fibonacci(i);
writeln('f(',i:2,')=',f[i]);
end;
end.
    • good
    • 0

pascalを使ったことがないので的外れかもしれませんがfibonacci(integer)はオーバーフローしていませんか?



あと、配列を作って答えを入れるなら、同じ計算を何度もする必要はないような気がしますが.....まあ単純な計算だから大丈夫かな。

プログラムの文法についてはわかりません。 
>うまく表示されない
というのは、途中で止まってしまうのか、まったく動かないのか、間違えた答えが表示されるのか、そのあたりがわかるとよいかも。 
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!