斐波那契数列求第n项的值

星座运势网编2023-07-29 12:051910

求斐波那契数列第n项的值

百度到的斐波那契数列定义:

斐波那契数列( ),又称黄金分割数列、因数学家列昂纳多·斐波那契( )以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)

方法一:递归

数列的第n项(除第1项和第2项)是第n-1项与第n-2项的和。数列满足递归的关系,故可用递归算法求第n项的值。

用递归求解,最重要的事是确定结束条件,给算法一个出口。本题中结束递归的条件为:n等于1或n等于2。

算法如下:

int (int* n)

step1:若n等于1或n等于2, 1;否则,进入step2;

step2: (n-1)+(n-2);

代码实现:

int Fibonacci(int* n)
{
	if(n==1||n==2)
		return 1;
	else
		return Fibonacci(n-1)+Fibonacci(n-2);
}

方法二:迭代

从斐波那契数列的第1项开始,按递推公式找到数列的每一项的值,直到找到第n项的值。

1 1 -> 1 1 2 -> 1 1 2 3 -> 1 1 2 3 5-> 1 1 2 3 5 8 -> …

代码如下:

int Fibonacci(int* n)
{
	int i, n1=1, n2=1, sum=0;
	for(i=3;i<=n;i++)
	{
		sum = n1+n2;
		n1 = n2;
		n2 = sum;
	}
	return sum;
}

方法三:用栈还原方法一的递归算法(注:本方法纯属个人练手,可跳过)

本题方法一的递归算法,有点类似二叉树的中序遍历。趁最近正在学二叉树,感觉非常打脑壳,用这个斐波那契数列递归算法非递归化找下手感。

直接放伪代码了:

int Fibonacci (int n)
{
	if(n==0||n==1)
		return 1;
	answer=0;
	for(i=n;;i--)//n到2依次入栈
	{
		if(i==1)
		{
			answer += 1;
			//i等于1,不入栈,把第2项的数值1加在answer上
			break;
		}
		else
			push(stack, i);//i大于1就入栈
	}
	while(!empty(stack)) 
	{
		top = gettop(stack);
		if(top-2==0||top-2==1)//如果栈顶的数值-2等于0或1,把数值1加到answer上(第1项的值和第2项的都等于1)
		{
			answer += 1;
			pop(stack);//此时top项已经计算完了(top-1项和top-2项的值都加在了answer上),弹出top项
		}
		else
		{
			pop(stack);
			push(stack, top-2);
			for(i=gettop(stack)-1;;i--)//top-1到2依次入栈
			{
				if(i==1)
				{
					answer += 1; 
					//i等于1,不入栈,把第2项的数值1加在answer上	
					break;
				}
				else
					push(stack, i); //i大于1就入栈
			}
		}
	}
	return answer;//最后,answer即为第n项的值
}

评论区