栈的基本应用

其实栈在斐波那契数列当中其实就得到了应用

关于斐波那契数列的数学定义如下所示
这里写图片描述

如果我们采取常规的迭代的方法去求的话其实也算比较简单了

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;
}

其实这里就是发生了自己去调用自己的情况,我们把这种情况称为是递归,每个递归定义必须至少有一个条件,满足的时递归不再进行,即不再引用自身而是返回

这两种实现斐波那契的代码。迭代和递归的区别是:迭代使用的是循环结构,递归使用的是选择结构。递归能使程序的结构更清晰、更简洁、更容易让人理解,从而减少读懂代码的时间。但是大量的递归调用会建立函数的副本,会耗费大量的时间和内存。迭代则不需要反复调用函数和占用额外的内存。因此我们应该视不同情况选择不同的代码实现方式

简单的说,就是在前行阶段,对于每一层递归,函数的局部变量、参数值以及返回地址都被压入栈中。在退回阶段,位于栈顶的局部变量、参数值和返回地址被弹出,用于返回调用层次中执行代码的其余部分,也就是恢复了调用的状态

猜你喜欢

转载自blog.csdn.net/zcmuczx/article/details/80904417