C语言用递归法和非递归法求斐波那契数

  今天想来分享一下用C语言求斐波那契数的方法。这里引用一下百度中对斐波那契数的定义。

  斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368…  这个数列从第三项开始,每一项都等于前两项的和。
  如果设F(n)为该数列的第n项(n∈N*),那么这句话可以写成如下形式::F(n)=F(n-1)+F(n-2)显然这是一个线性 递推数列。

  我们从这个递推公式可以很自然的想到用递归法求斐波那契数。下面附上代码。

#include<stdio.h>
int fib(int n)
{
	if(n<=2)  //跳出条件
		return 1;  //斐波那契数从第三项开始,前两项都是1
	else
		return fib(n-1)+fib(n-2);  //限制条件。第n个斐波那契数等于它前面两项的和
}
int main()
{
	int n = 0;
	scanf("%d",&n);  //输入我们要求的第n个斐波那契数
	printf("%d ",fib(n));
return 0;
}

  递归法的思想就是把一个大的复杂的问题层层转化成一个与原问题相似的小问题来解决,即“大事化小"。
  而我们要求第n个斐波那契数,它就等于第n-1个斐波那契与第n-2个斐波那契数的和。问题就转化成了求第n-2和第n-1个斐波那契数。而第n-1个斐波那契数就等于第n-2个和第n-3个斐波那契数的和。依此类推,直到求出结果。
  在我们用递归法时要注意,它有两个必要条件。第一个条件是跳出条件,也就是说当满足这个条件时,递归便不再继续。第二个条件是限制条件,也就是说,每次递归调用之后要越来越接近这个限制条件。本题中将两个条件已注释在代码旁。我们将代码运行结果附在下面。
在这里插入图片描述

  下面我们用非递归的方法再做一遍。

#include<stdio.h>
int fib(int n)
{
	int a = 1;  //对第一个斐波那契数赋初值
	int b = 1;  //同理
	int c = 0;  //用C来存放第n个斐波那契数的值
	int i = 0;
	if(n<=2)
		return 1;
	while(n>2)
	{
		for(i=0; i<n-2; i++)
		{
			c = a+b;  //第n个斐波那契数等于第n-1和n-2的和
			a = b;  
			b = c;
			n--;
		}
	}
	return c;
}
int main()
{
	int n = 0;
	scanf("%d",&n);
	printf("%d",fib(n));
return 0;
}

这个运行结果也是正确的,非递归采用简单的for循环法。

猜你喜欢

转载自blog.csdn.net/qq_43232778/article/details/83005031
今日推荐