用递归方法和优化后的方法分别输出斐波那契数列前五十项

用递归方法和优化后的方法分别输出斐波那契数列前五十项,要求每一项都输出,每行一项,各位佬怎么解决?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)程序运行结果
递归算法的运行结果(运行速度相对动态规划要慢很多很多):

img


动态规划算法的运行结果:

img

#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);
}