栈:就是后进先出的一种数据结构,所谓的后进先出就是:后入栈变量数据,先出栈计算处理.
递归:与栈类似,递归到最内层(到退出条件),开始从内层向外逐层调用函数自己计算处理.
帮助理解递归,写一个阶乘函数
factorial(4)
= 4 * factorial(3)
= 4 * (3 * factorial(2) )
= 4 * (3 * (2 * factorial(1) ) )
= 4 * (3 * (2 * (1 * factorial(0) ) ) )
本质自己调用自己4次,递归至factorial(0),先计算factorial(0)函数,然后逐层调用返回:factorial(1)、factorial(2)、factorial(3).
#include<iostream>
using namespace std;
void Countdown(int n){
if(n>0){
cout<<"Countdown:"<< n<< endl;
Countdown(n - 1);
}
cout<<"n:"<<n<< endl;
}
int main(){
Countdown(4);
return 0;
}
Countdown(n)函数不停的入栈(push),Countdown(4)先入的栈,所以在栈底,Coutdown(1)最后入的栈,所以在栈顶:如
Coutdown(1) 栈顶 后入栈,先处理
Coutdown(2)
Coutdown(3)
Coutdown(4) 栈底 先入栈,后处理
栈是后进先出,一共调用4次Countdown()函数,这时先出栈(pop)的是栈顶Countdown(1),会打印n = 1;接着出栈(pop)的是Countdown(2),打印n = 2,依次类推3,4;注意打印的n=0是退出条件。
Coutdown(4){
Coutdown(3){
Coutdown(2){
Coutdown(1){ }
}
}
}
递归本质类似栈后进先出,递归至Coutdown(1)后,先计算Coutdown(1)函数,然后逐层调用返回:Coutdown(2)、Coutdown(3)、
Coutdown(4).
递归的本质和栈数据的存取(后进先出)很相似,都是后进去,但是往往先处理!再者对于递归函数的局部变量的存储是按照栈的方式去存的,对于每一层的递归函数在栈中都保存了本层函数的局部变量,一边该层递归函数结束时能够保存原来该层的数据。