【C语言】斐波那契数列(Fibonacci sequence)递归实现 和 非递归实现

斐波那契数列 引出

斐波那契数列的应用十分广泛,这里不再列举。

在这里插入图片描述

C语言代码实现——递归

同时也有许多种代码实现方式,这里仅列举C语言的实现方法:

核心思想是使用“递归”。

//C语言:递归实现 Fibonacci数列
//输入n,求 Fibonacci[n]   (在数学中,常常写作Fibonacci(n) ) 
#include <stdio.h>
#define N 100
long Fibonacci(int n);
int main(){
    
    
	int n;
	long k;
	printf("请输入n:");
	scanf("%d",&n);
	k=Fibonacci(n);
	putchar('\n');
	printf("Fibonacci(%d)=%ld\n",n,k);
	
	
	return 0;
	
}
long Fibonacci(int n){
    
    
	if(n==1||n==2)
	{
    
    
		return 1;
	}	
	else{
    
    
		return Fibonacci(n-1)+Fibonacci(n-2);
	}		
}

几个测试:

在这里插入图片描述

在这里插入图片描述

下面这个例子,数据太大时,应当会出错:由于精度问题、表示范围问题。
正解:Fibonacci(50) = 12 586 269 025
而且注意下面的耗时,也很长。
在这里插入图片描述

查看课本可知,long int的表示范围是:
-2 147 483 648 ~ 2 147 483 647(10位数)。而上面Fibonacci(50)结果是11位数,当然会出错!

同样,下面结果也不对:
也是因为表示范围问题。
正解:Fibonacci(49) = 7 778 742 049
在这里插入图片描述
下面来测试个正确的结果:↓ ↓ ↓
在本机测试中,第46项即Fibonacci(46)应当是 long int 能测试的最大值了。
耗时8.822秒。
在这里插入图片描述

C语言代码实现——非递归

//非递归实现Fibonacci数列
#include <stdio.h>
long Fibonacci(int n);
int main(){
    
    
	int n;
	long k;
	printf("请输入n:");
	
	scanf("%d",&n);
	k=Fibonacci(n);
	
	putchar('\n');
	printf("Fibonacci(%d)=%ld\n",n,k);
	
	return 0;
}
//非递归实现Fibonacci数列 
long Fibonacci(int n)
{
    
    
	int n1=1,n2=1;
	int t=0,i=0;
	if (n<3)
	{
    
    	//即如果n为1或者2的话,那么Fibonacci(1) = Fibonacci(2)=1 
		return 1;
	}
	else  //下面举个例子,便于理解: 
	{
    
    //例如n为6,我们知道Fibonacci数列为:1、1、2、3、5、8...
	//此时对于下面for循环,则i=0,i<4。开始时n1和n2都是1,即第一和第二项 
		for(i=0; i<n-2; i++)
		{
    
    	
			t = n1 + n2; //t就是数列第三项,为 1+1=2 
			n1 = n2; //注意:令n2赋值给n1,即n1和n2分别 后移一位,这时新的n1即第二项F(2)=1 
			n2 = t;	//这里同理,t作为新的n2,即F(3)=2 
			//依次类推,即可实现求每一项,然后得到 Fibonacci(6),即 Fibonacci(n) 
		}//注意:如果还不好理解,那么动笔写一下就会理解啦! 
		return t;
	}
}

我觉得我把注释写的已经比较清楚了,如果不明白的话,看一下下面这个图,应该会很好理解:
在这里插入图片描述

那么接下来还是几个测试:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
事实证明,上面的结果是正确的。

(另外,对于斐波那契数列的前100项,我将以一个txt的格式上传到“资源”中,可以直接下载。)

至于选用哪个,建议初学者还是使用递归的方式,更便于理解。

猜你喜欢

转载自blog.csdn.net/qq_44731019/article/details/123613913