求斐波那契数的栈模拟递归算法
其中,斐波那契数(Fobanacci)定义如下:
f(1)=1 —————————————-(1)
f(2)=1 —————————————-(2)
f(n)=f(n-1)+f(n-2),其中n>=2 ———(3)
算法描述:
1)首先定义一个栈,其结构如下:
struct
{
int vn;//保存n值
int vf;//保存Fobanacci(n)的值
int tag;//标志是否已经计算出Fobanacci(n)的值
//若tag==0,表示已经计算出,如果tag==1,表示否
}stack[MAXSIZE];
2)这里假设计算Fobanacci(5)的值。
先让(5, ,1)进栈,也就是使得当前栈顶元素的vn值为5,tag值为1.
因为Fobanacci的特殊性使得Fobanacci(1)= Fobanacci(2)=1,
所以这里可以提前定义Fobanacci(1)=1,即stack[n - 1].vf = 1;
while(栈不为空,即top>-1)
{
if(未求出栈顶元素的vf值,即stack[top].tag==1)
{
if(如果栈顶元素满足(1)式f(1)=1)
{
令对应的vf值为1,tag值为0
}
else if(如果栈顶元素满足(2)式f(2)=1)
{
令对应的vf值为1,tag值为0
}
else //栈顶元素满足(3)式,f(n)=f(n-1)+f(n-2),其中n>=2
{
计算出让栈顶下一个元素的vn值,其值等于栈顶vn值减1
并且令tag值为1
}
}
else if(求出栈顶元素的vf值,即stack[top].tag==0)
{
根据公式Fobanacci(n)=Fobanacci(n-1)+Fobanacci(n-2);
计算栈顶下一个元素的vf值,计算完后top--;并让tag置为0
}
if(栈中只有一个已经求出vf的元素)
stack[top].vf 就是所求的结果
}
代码实现:
#include "stdio.h"
#define MAXSIZE 100
struct
{
int vn;//保存n值
int vf;//保存Fobanacci(n)的值
int tag;//标志是否已经计算出Fobanacci(n)的值
//若tag==0,表示已经计算出,如果tag==1,表示否
}stack[MAXSIZE];
//
int Fobanacci(int n)
{
int top = 0;
//初值进栈
stack[top].vn = n;
stack[top].tag = 1;
stack[n - 1].vf = 1;//Fobanacci(1)==1;
while (top > -1)//栈不空时循环
{
if (stack[top].tag == 1)//未计算出栈顶元素vf值
{
//如果是求//Fobanacci(1),则另tag=0,vf=1
if(stack[top].vn==1)
{
stack[top].tag = 0;
stack[top].vf = 1;
}
//如果是求//Fobanacci(2);另tag=0,vf=1
else if (stack[top].vn == 2)
{
stack[top].vf = 1;
stack[top].tag = 0;
}
//否则计算出让栈顶下一个元素的vn值,其值等于栈顶vn值减1.
else
{
top++;
stack[top].vn = stack[top - 1].vn - 1;
stack[top].tag = 1;
}
}
//如计算出栈顶元素的vf值
else if (stack[top].tag == 0)
{
//根据公式Fobanacci(n)=Fobanacci(n-1)+Fobanacci(n-2);
//计算栈顶下一个元素的vf值,计算完后top--;并让tag置为0
stack[top-1].vf = stack[top].vf + stack[top+1].vf;
stack[top-1].tag = 0;
top--;
}
//所求的结果
if (stack[top].tag == 0 && top == 0)
return stack[top].vf;
}
}
int main()
{
printf("Fobanacci(5)=%d", Fobanacci(5));
getchar();
}
实现结果: