如何理解栈在斐波那契递归调用中的作用?
在做mips计算机组成原理大作业遇到了斐波那契问题
翻回数据结构课本的时候发现,课本上有一张图,完了,上课好像没有认真听这一段
慢慢研究这张图也感觉一头雾水,那么这个时候不如写个程序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;
}
观察终端输出我们就可以知道栈到底怎样工作了!其实工作的顺序跟树的先序遍历非常像,左子树走到底然后走右子树
其实也就是以这样的方式进行调用的
再回看课本对于递归调用这一小结的介绍——递归结束的时候逐层释放存储空间,“先调用后返回”返回各层的返点,也显得格外有道理。