用递归方法和优化后的方法分别输出斐波那契数列前五十项,要求每一项都输出,每行一项,各位佬怎么解决?c语言和linux下的go语言
(1)问题分析
求解斐波那契序列最直观的想法是使用递归方法,但是斐波那契序列的递归冗余度很高,计算量会指数级增大。改进的方法一般是通过动态规划。动态规划的思想是用表记录递归算法子问题的解,减少重复计算。
(2)问题的解决代码
#include <stdio.h>
//基于递归的斐波那契序列求解
//(注意这里返回值不能是int,因为第50项12586269025已经超出了int的存储范围)
double Fib_by_recursion(int n)
{
if (n == 0 || n == 1)
{
return 1;
}
return Fib_by_recursion(n - 2) + Fib_by_recursion(n - 1);
}
//基于动态规划的斐波那契序列求解
double Fib_by_dynamic_program(int n)
{
int i;
double first = 1, second = 1, result = 1;
for (i = 2; i <= n; i++)
{
result = first + second;
first = second;
second = result;
}
return result;
}
int main()
{
int item_num = 50;
int i;
for (i = 0; i < item_num; i++)
{
//printf("%.0f\n", Fib_by_recursion(i)); //选择使用递归算法
printf("%.0f\n", Fib_by_dynamic_program(i)); //选择使用动态规划算法
}
return 0;
}
(3)程序运行结果
递归算法的运行结果(运行速度相对动态规划要慢很多很多):
#include <stdio.h>
long long func(int n,int m)
{
if(n==0)
return 0;
if (n==1)
{
if(m==0)
printf("1\n");
return 1;
}
else
{
long long s;
if(m==1)
s = func(n-1,1) + func(n-2,1);
else
s = func(n-1,0) + func(n-2,1);
if(m==0)
printf("%lld\n",s);
return s;
}
}
int main()
{
func(50,0);
}