递归的本质(栈:后进先出)

栈:就是后进先出的一种数据结构,所谓的后进先出就是:后入栈变量数据,先出栈计算处理.

递归:与栈类似,递归到最内层(到退出条件),开始从内层向外逐层调用函数自己计算处理.

帮助理解递归,写一个阶乘函数

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).

递归的本质和栈数据的存取(后进先出)很相似,都是后进去,但是往往先处理!再者对于递归函数的局部变量的存储是按照栈的方式去存的,对于每一层的递归函数在栈中都保存了本层函数的局部变量,一边该层递归函数结束时能够保存原来该层的数据。

Reference

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Android系统攻城狮

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值