Wikioi 天梯 Fibonacci数列 3(1978)
2013-08-11 09:22
218 查看
题目描述 Description
斐波纳契数列是这样的数列:f1 = 1
f2 = 1
f3 = 2
f4 = 3
....
fn = fn-1 + fn-2
输入一个整数n
求fn
输入描述 Input Description
一个整数n, n<= 40
输出描述 Output Description
一个整数fn
样例输入 Sample Input
3
样例输出 Sample Output
2
数据范围及提示 Data Size & Hint
n<=40很高兴,比起上一题,本题很能体现递推的优越性(其实pascal语言由于申请栈空间时有时间损耗,所以递推算法对于p党来说普遍优于递归算法)(RE:202也算一条吧~~)
本题既然给出了规律,那么问题其实就是根据规律依靠已知(一般是fib[1]和fib[2])求未知(fib
)。
规律体现了这样的递推式:fib
=fib[n-1]+fib[n-2]
首先递归实现十分简单(这也是递归的好处,很难想出递推顺序的果断用递归骗分),不断递归直到n=1 or 2。
但是递归过程中(没有记忆化)会造成重复计算,由于计算f
和f[n-1]时,都用到f[n-2],然而两者的计算过程是独立进行的,所以f[n-2]就悲催地被计算了两次,每次计算都要递归到最深层。这样一来有形的时间就增加了一倍(还有上文说过的pascal缺点)。这是递推就大显身手。
如果说递归是被动索取,那么递推就是主动探索。递推由已知出发,不断把未知变成已知,直到所求的答案也变成已知。
那么为了使算过的数不被忘掉,我们需要数组来实现,不断计算fib
,把它存在f数组的f
中,下次用到fib
时直接调用f
的值。
递推对pascal来说,一不爆栈,二节省时间,这是递归所没有的。
算法描述:读入n,依次计算fib[i]的值,直到i=n。输出f
。
Program fib;
Var
n,i:longint;
f:array[1..100]of longint;
Begin
readln(n);
fillchar(f,sizeof(f),0);
f[1]:=1;
f[2]:=1;
for i:=3 to n do f[i]:=f[i-1]+f[i-2];
writeln(f
);
End.
相关文章推荐
- wikioi 1978 Fibonacci数列 3
- Wikioi 天梯 最大公约数和最小公倍数问题(1012)
- wikioi-天梯-普及一等-序列dp-3027:线段覆盖 2
- wikioi-天梯-提高一等-棋盘dp-1169:传纸条
- 【wikioi】1250 Fibonacci数列(矩阵乘法)
- 【CodeVS】1978 Fibonacci数列3
- codevs天梯 fibonacci数列水题
- Wikioi 天梯 最大公约数(1212)
- wikioi-天梯-普及一等-划分dp-1017:乘积最大
- wikioi天梯之1214 线段覆盖 贪心
- 【CodeVS】1978 Fibonacci数列3
- Wikioi 天梯 素数判定(1430)
- wikioi-天梯-普及一等-划分dp-1039:数的划分
- wikioi天梯之3116 高精度练习之加法
- Wikioi 天梯 最大数最小数(1201)
- wikioi-天梯-普及一等-区间dp-1048:石子归并
- wikioi-天梯-提高一等-启发式搜索-1074:靶形数独
- wikioi天梯之3117 高精度练习之乘法
- 1978 Fibonacci数列 3
- Wikioi 天梯 求和(1202)