结构体4/14

结构体随笔

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

发布了5 篇原创文章 · 获赞 0 · 访问量 12

猜你喜欢

转载自blog.csdn.net/achcvb/article/details/105506649