如何理解栈在斐波那契递归调用中的作用?

如何理解栈在斐波那契递归调用中的作用?

在做mips计算机组成原理大作业遇到了斐波那契问题
翻回数据结构课本的时候发现,课本上有一张图,完了,上课好像没有认真听这一段question

慢慢研究这张图也感觉一头雾水,那么这个时候不如写个程序debug下,跟着程序走,看看程序到底是怎样进行fib函数递归的:
关于函数递归调用的基本原理,可以看看bilibili的这个视频,关于函数在栈中的调用讲的很清楚 https://www.bilibili.com/video/BV1yB4y1M7vh/?p=3 。

一开始我写成return fib(n-1)+fib(n-2)发现不是很清晰,难以通过输出来理解过程,后来改成了统一出口res,再将过程分开成

res=fib(n-1)+res;        
res=fib(n-2)+res;

这样再两者之间可以通过输入来看到递归到哪一步了。

这里附上代码:

//通过拆分的方式完整地模拟了fib递归调用的实例
#include<iostream>
using namespace std;

int fib(int n){
   int res;
     if(n==0||n==1){
         res=n;
     }else{
         cout << "ready to calculate " << "fib(" << n-1 << ")" << endl;
         res=fib(n-1)+res;
         cout << "ready to calculate " << "fib(" << n-2 << ")" << endl;
         res=fib(n-2)+res;
         cout << "fib(" << n << ")is calculated" <<endl;
     }
     return res;
  }
  
int main(){
    int n;
    cout << "please input n:";
    cin >> n;
    int fb;
    fb=fib(n);
    cout <<"fib("<< n << ")is " << fb;
    return 0;
}

观察终端输出我们就可以知道栈到底怎样工作了!其实工作的顺序跟树的先序遍历非常像,左子树走到底然后走右子树

result
其实也就是以这样的方式进行调用的原理
再回看课本对于递归调用这一小结的介绍——递归结束的时候逐层释放存储空间,“先调用后返回”返回各层的返点,也显得格外有道理。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值