其实栈在斐波那契数列当中其实就得到了应用
关于斐波那契数列的数学定义如下所示
如果我们采取常规的迭代的方法去求的话其实也算比较简单了
int main()
{
int i;
int a[40];
a[0] = 0;
a[1] = 1;
printf("%d ", a[0]);
printf("%d ", a[1]);
for (i = 2; i < 40; i++)
{
a[i] = a[i - 1] + a[i - 2];
printf("%d ", a[i]);
}
return 0;
}
但如果说我们用迭代的方法去做的话其实会更加简单
/* 斐波那契的递归函数 */
int Fbi(int i)
{
if (i < 2)
return i == 0 ? 0 : 1;
/* 这里Fbi就是函数自己,它在调用自己 */
return Fbi(i - 1) + Fbi(i - 2);
}
int main()
{
int i;
for (i = 0; i < 40; i++)
printf("%d ", Fbi(i));
return 0;
}
其实这里就是发生了自己去调用自己的情况,我们把这种情况称为是递归,每个递归定义必须至少有一个条件,满足的时递归不再进行,即不再引用自身而是返回
这两种实现斐波那契的代码。迭代和递归的区别是:迭代使用的是循环结构,递归使用的是选择结构。递归能使程序的结构更清晰、更简洁、更容易让人理解,从而减少读懂代码的时间。但是大量的递归调用会建立函数的副本,会耗费大量的时间和内存。迭代则不需要反复调用函数和占用额外的内存。因此我们应该视不同情况选择不同的代码实现方式
简单的说,就是在前行阶段,对于每一层递归,函数的局部变量、参数值以及返回地址都被压入栈中。在退回阶段,位于栈顶的局部变量、参数值和返回地址被弹出,用于返回调用层次中执行代码的其余部分,也就是恢复了调用的状态