var m,n:qword;
a:array [1..93] of qword;
b:array [1..93] of boolean;
function p(x:qword):qword;
var t:qword;
begin
if b[x] then exit(a[x])
else
begin
t:=p(x-1)+p(x-2);
a[x]:=t;
b[x]:=true;
exit(t);
end;
end;
begin
readln(n);
a[1]:=1;
a[2]:=1;
b[1]:=true;
b[2]:=true;
writeln(p(n));
end.
非高精度递归做法。
b[k]=true 表示k已经计算过,直接调用a里以前算出来的数
var
n,i,a,b,c:integer;
begin
a:=1;
b:=1;
readln(n);
if n=1 then writeln(1);
if n=2 then writeln(1);
if n>=3 then
begin
for i:=3 to n do
begin
c:=a+b;
a:=b;
b:=c;
end;
writeln(b);
end;
end.
方法一:递推
var a:array[1..10000] of longint;
i,n:longint;
begin
readln(n);
a[1]:=1;
a[2]:=1;
for i:=3 to n do a[i]:=a[i-1]+a[i-2];
writeln(a[n]);
end.
方法二:通项公式
var n:longint;
begin
readln(n);
writeln( (exp(ln(1+sqrt(5)/2)*n)+exp(ln(1-sqrt(5))*n))/sqrt(5) );
end.
临时打的,可能有细节部分语法错误,请自己修改。