C语言编程:用递归和非递归法输出斐波那契数列

已知斐波那契数列第n项的计算公式如下。在计算时有两种算法:递归和非递归,通过输出数列前40项,体会两种方法的差异。
当n=0时,Fib(n)=0;当n=1时,Fib(n)=1;当n>1时,Fib(n)= Fib(n-1)+ Fib(n-2).
试过了,很多语法错误啊,能帮忙再改改吗?

你用的什么编译器 我用VC++6.0完全正常 我给你贴图

循环版&nbsp 

=========================================&nbsp 

#include&nbsp&nbsp;&nbsp&nbsp;<stdio.h>&nbsp&nbsp;

int&nbsp&nbsp;&nbsp&nbsp;main()&nbsp&nbsp;

{&nbsp&nbsp;

&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;unsigned&nbsp&nbsp;&nbsp&nbsp;int&nbsp&nbsp;&nbsp&nbsp;a[40]&nbsp&nbsp;&nbsp&nbsp;=&nbsp&nbsp;&nbsp&nbsp;{0,&nbsp&nbsp;&nbsp&nbsp;1};&nbsp&nbsp;

&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;printf&nbsp&nbsp;&nbsp&nbsp;("%d\n%d\n",&nbsp&nbsp;&nbsp&nbsp;a[0],&nbsp&nbsp;&nbsp&nbsp;a[1]);&nbsp&nbsp;

&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;for&nbsp&nbsp;&nbsp&nbsp;(&nbsp&nbsp;&nbsp&nbsp;int&nbsp&nbsp;&nbsp&nbsp;i&nbsp&nbsp;&nbsp&nbsp;=&nbsp&nbsp;&nbsp&nbsp;2;&nbsp&nbsp;&nbsp&nbsp;i&nbsp&nbsp;&nbsp&nbsp;<&nbsp&nbsp;&nbsp&nbsp;40;&nbsp&nbsp;&nbsp&nbsp;++i)&nbsp&nbsp;

&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;{&nbsp&nbsp;

&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;a[i]&nbsp&nbsp;&nbsp&nbsp;=&nbsp&nbsp;&nbsp&nbsp;a[i-1]&nbsp&nbsp;&nbsp&nbsp;+&nbsp&nbsp;&nbsp&nbsp;a[i-2];&nbsp&nbsp;

&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;printf&nbsp&nbsp;&nbsp&nbsp;("%d\n",&nbsp&nbsp;&nbsp&nbsp;a[i]);&nbsp&nbsp;

&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;}&nbsp&nbsp;

&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;return&nbsp&nbsp;&nbsp&nbsp;0;&nbsp&nbsp;

}&nbsp&nbsp;

===========================================&nbsp&nbsp;

递归版&nbsp&nbsp;

===========================================&nbsp&nbsp;

#include&nbsp&nbsp;&nbsp&nbsp;<stdio.h>&nbsp&nbsp;

int&nbsp&nbsp;&nbsp&nbsp;fb&nbsp&nbsp;&nbsp&nbsp;(int&nbsp&nbsp;&nbsp&nbsp;i)&nbsp&nbsp;

{&nbsp&nbsp;

&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;if&nbsp&nbsp;&nbsp&nbsp;(&nbsp&nbsp;&nbsp&nbsp;i&nbsp&nbsp;&nbsp&nbsp;<&nbsp&nbsp;&nbsp&nbsp;2&nbsp&nbsp;&nbsp&nbsp;)&nbsp&nbsp;

&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;return&nbsp&nbsp;&nbsp&nbsp;i&nbsp&nbsp;&nbsp&nbsp;==&nbsp&nbsp;&nbsp&nbsp;0&nbsp&nbsp;&nbsp&nbsp;?&nbsp&nbsp;&nbsp&nbsp;0&nbsp&nbsp;&nbsp&nbsp;:&nbsp&nbsp;&nbsp&nbsp;1;&nbsp&nbsp;

&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;return&nbsp&nbsp;&nbsp&nbsp;fb&nbsp&nbsp;&nbsp&nbsp;(i&nbsp&nbsp;&nbsp&nbsp;-&nbsp&nbsp;&nbsp&nbsp;1)&nbsp&nbsp;&nbsp&nbsp;+&nbsp&nbsp;&nbsp&nbsp;fb&nbsp&nbsp;&nbsp&nbsp;(i&nbsp&nbsp;&nbsp&nbsp;-&nbsp&nbsp;&nbsp&nbsp;2);&nbsp&nbsp;

}&nbsp&nbsp;

int&nbsp&nbsp;&nbsp&nbsp;main()&nbsp&nbsp;

{&nbsp&nbsp;

&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;for&nbsp&nbsp;&nbsp&nbsp;(&nbsp&nbsp;&nbsp&nbsp;int&nbsp&nbsp;&nbsp&nbsp;i&nbsp&nbsp;&nbsp&nbsp;=&nbsp&nbsp;&nbsp&nbsp;0;&nbsp&nbsp;&nbsp&nbsp;i&nbsp&nbsp;&nbsp&nbsp;<&nbsp&nbsp;&nbsp&nbsp;40;&nbsp&nbsp;&nbsp&nbsp;++i)&nbsp&nbsp;

&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;printf&nbsp&nbsp;&nbsp&nbsp;("%d\n",&nbsp&nbsp;&nbsp&nbsp;fb&nbsp&nbsp;&nbsp&nbsp;(i));&nbsp&nbsp;

&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;return&nbsp&nbsp;&nbsp&nbsp;0;&nbsp&nbsp;

}&nbsp&nbsp;

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-02-18

非递归

#include<stdio.h>
#define END 40//结束的值,可更改
int main(void)
{
    int i;
    long long a=-1,b=1,t;
    for(i=0;i<=END;i++)
    {
        t=a+b;
        printf("%lld\t%lld\n",i,t);
        a=b;
        b=t;
    }
    return 0;
}

递归

#include<stdio.h>
#define END 40//结束的值,可更改
void fib(long long a,long long b,int i);
int main(void)
{
    fib(-1,1,-1);//这是我手工凑的
    return 0;
}
void fib(long long a,long long b,int i)
{
    int t;
    i++;
    t=a+b;
    printf("%lld\t%lld\n",i,t);
    if(i<END)
    {
        fib(b,t,i);
    }
}‍

第2个回答  2015-12-04

递归法:

#include<stdio.h>
void main()
{
int Fibonacci(int n);
int n,i,c=0;

printf("请输入n的值:");
scanf("%d",&n);
for(i=1; i<=n; i++)
{
c = Fibonacci(i);
printf("%12ld",c);
if(i%4==0) //用于换行 4个一行;
printf("\n");
}
}

int Fibonacci(int n)//函数部分;
{
long int f;

if(n==1 || n==2)
{
f=1;
}
else
if(n>=3)
f = Fibonacci(n-1) + Fibonacci(n-2);
return f;
}

非递归法:

#include<stdio.h>
void main()
{
int i,n;
int f[]= {1,1};
printf("请输入n的值:");
scanf("%d",&n);
for(i=2; i<=n; i++)
f[i] = f[i-2] + f[i-1];
for(i=0; i<=n; i++)
{
if(i%5==0) printf("\n");
printf("%12d",f[i]);

}
printf("\n");
}

递归可以使程序看起来比较简洁,但缺点是效率比较低,并且可能导致栈溢出,因此需要灵活使用递归。

第3个回答  2019-01-29
递归法:
#include<stdio.h>
void main()
{
int Fibonacci(int n);
int n,i,c=0;
printf("请输入n的值:");
scanf("%d",&n);
for(i=1; i<=n; i++)
{
c = Fibonacci(i);
printf("%12ld",c);
if(i%4==0) //用于换行 4个一行;
printf("\n");
}
}
int Fibonacci(int n)//函数部分;
{
long int f;
if(n==1 || n==2)
{
f=1;
}
else
if(n>=3)
f = Fibonacci(n-1) + Fibonacci(n-2);
return f;
}
非递归法:
#include<stdio.h>
void main()
{
int i,n;
int f[]= {1,1};
printf("请输入n的值:");
scanf("%d",&n);
for(i=2; i<=n; i++)
f[i] = f[i-2] + f[i-1];
for(i=0; i<=n; i++)
{
if(i%5==0) printf("\n");
printf("%12d",f[i]);
}
printf("\n");
}
递归可以使程序看起来比较简洁,但缺点是效率比较低,并且可能导致栈溢出,因此需要灵活使用递归。
相似回答