递归调用栈(算法图解)

递归

每个递归函数都有两部分:基线条件(base case)和递归条件(recursive case)。

递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。

调用栈:用于存储多个函数的变量。

//1.调用greet("sally"),计算机将首先为该函数调用分配一块内存
def greet(name): 
     //2.此时打印hello,sally!
     print "hello, " + name + "!"  
     //3.此时调用了greet2("sally")
     greet2(name) 
     //7.打印准备说再见啦
     print "准备说再见啦..." 
     //8. 此时调用bye 
     bye() 
    
//4.进入greet2,同样为它分配一块内存
def greet2(name): 
    //5.打印 你好吗,sally?
    print "你好吗, " + name + "?"  
//6.这时greet2函数调用完毕,从栈顶弹出

//9.进入bye,同样为它分配一块内存
def bye(): 
    //10.打印 好的拜拜啦 
    print "好的拜拜啦!" 
//11.这时bye函数调用完毕,从栈顶弹出

//12.最后又回到了函数greet,内部函数已经都调用完毕,故从greet返回。

这里的greet就是调用栈,所有函数调用都进入调用栈。不过调用栈可能很长,会占用大量的内存。

递归调用栈

比如下面用递归写的阶乘函数:

def fact(x):  //令 x = 3
    if x == 1;
    return 1
else:
    return x * fact(x-1)

在这里插入图片描述
在这里插入图片描述
注意,每个fact调用都有自己的x变量。在一个函数调用中不能访问另一个的x变量

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值