主题:[讨论]急!!怎么用递归做菲波拉契数列!
sky风吻
[专家分:30] 发布于 2007-10-20 16:24:00
a0=0
a1=1
a2=a0+a1
....
将第N项的A(N)写成递归函数计算.
回复列表 (共7个回复)
沙发
angwuy [专家分:2280] 发布于 2007-10-20 20:27:00
f[n]:=f[n-1]+f[n-2]
板凳
abcwuhang [专家分:1840] 发布于 2007-10-20 20:38:00
var s:longint;
function digit(p:longint);
begin
if p=1 then digit:=0
else if p=2 then digit:=1
else digit:=digit(p-1)+digit(p-2);
end;
begin
readln(s);
writeln(digit(s));
end.
3 楼
游侠UFO [专家分:1200] 发布于 2007-10-20 23:10:00
[quote]var s:longint;
function digit(p:longint);
begin
if p=1 then digit:=0
else if p=2 then digit:=1
else digit:=digit(p-1)+digit(p-2);
end;
begin
readln(s);
writeln(digit(s));
end.[/quote]
这种方法数据一大肯定超时!
还是用数组保存结果这样比较快
4 楼
封天怒龙 [专家分:160] 发布于 2007-10-21 14:02:00
但楼主要用递归算啊
5 楼
abcwuhang [专家分:1840] 发布于 2007-10-21 16:54:00
同意3楼看法.(一般当n<20时可以秒出结果(0(20log(20)),但一般用数组(O(n))更快
6 楼
angwuy [专家分:2280] 发布于 2007-10-21 20:36:00
利用递归+数组:
var s:longint;
a:array[1..100]of longint;
function digit(p:longint):longint;
begin
if a[p]>0 then begin digit:=a[p];exit;end;
if p=1 then a[p]:=0
else if p=2 then a[p]:=1
else a[p]:=digit(p-1)+digit(p-2);
digit:=a[p];
end;
begin
fillchar(a,sizeof(a),0);
readln(s);
writeln(digit(s));
end.
7 楼
南飞的大雁 [专家分:50] 发布于 2007-10-29 09:16:00
function fibo(var n:integer):integer;
var i,j,k:integer;
begin
if (n=1)or(n=2) then fibo:=1
else fibo:=fibo(n-1)+fibo(n-2);
end;
begin
for i:=1 to n do
write(' ',fibo(i));
打印菲波拉契数列前n项
我来回复