结构体随笔
6-4 递归实现斐波那契数列
本题要求实现一个递归函数int fib(int n),返回斐波那契数列的第n项。例如如果n=5,则该函数应该返回5。
注:该数列的前面几项是: 1 1 2 3 5 8 13 21 34 …
函数接口定义:
int fib(int n);
其中 n 的值不超过1<=n<=46。
裁判测试程序样例:
#include <stdio.h>
/* 请在这里填写答案 */
int main(int argc, char const *argv[])
{
int n;
while (scanf("%d", &n) != EOF) {
printf("%d\n", fib(n));
}
return 0;
}
输入样例:
5
输出样例:
5
代码实现
用递归实现斐波那契数列
可以发现
可得f(n)=f(n-1)+f(n-2)
代码如下
int fib(int n)
{
if( n == 1 || n == 2)
return 1;
return fib( n-1) + fib( n-2);
}
但是会运行超时,所以要对代码进行优化
int fib(int n)
{ int a,b,i;
if(n==1||n==2) return 1;
a=1; b=1;
for(i=3;i<=n;i++)
{ b=a+b;
a=b-a;
}
return b;
}
还有其他优化算法如下
(其他大神的链接)
https://www.cnblogs.com/yizhaosan/p/10509919.html
1
其他大神的代码
int fib( int n)
{
if( n < 1)
return -1;
int *a = new int [n];
a[1] = a[2] = 1;
for( int i = 3; i <= n; i++)
a[i] = a[i-1]+a[i-2];
return a[n];
2
int fib_iter( int a, int b, int count)
{
if( count == 0)
return b;
return fib_iter( a+b, a, count-1);
}
int fib( int n)
{
return fib_iter( 1, 0, n);
}
https://blog.csdn.net/achcvb/article/details/105506649