空间复杂度

递归栈空间:
首先,函数本身也是在内存中占空间的,主要用于存储传递的参数,以及调用代码的返回地址。
函数的调用,会在内存的栈空间中开辟新空间,来存放子函数。递归函数更是会不断占用栈空间,例如该阶乘函数,展开到最后n=1时,内存中会存在factorial(100), factorial(99), factorial(98) … factorial(1)这些函数,它们从栈底向栈顶方向不断扩展。
当递归过深时,栈空间会被耗尽,这时就无法开辟新的函数,会报出stack overflow这样的错误。
所以,在考虑空间复杂度时,递归函数的深度也是要考虑进去的。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

递归栈:T a[]需要 2bytes 指针,n需要2bytes,返回地址需要2bytes。函数的调用,会在内存的栈空间中开辟新空间,展开到最后n=1时,内存中会存在Rsum(n), Rsum(n-1), Rsum(n-2) … Rsum(0)这些函数,它们从栈底向栈顶方向不断扩展。
从方法 "f0" 调用方法 "f1" 时,将创建与该方法 "f1" 相对应的堆栈帧。该堆栈帧将保留在内存中,直到函数 "f1" 的调用未终止。该堆栈帧负责保存函数“f1”的参数,函数 "f1" 中的局部变量以及调用方函数(函数 "f0")的返回地址。 在这里插入图片描述
  递归算法的空间复杂度与所生成的最大递归树的深度成正比。如果递归算法的每个函数调用都占用 O(m) 空间,并且如果递归树的最大深度为 n,则递归算法的空间复杂度将为 O(n·m)。
  上面所说Rsum递归算法最大递归树深度为n+1,每个函数占用6bytes,则空间需求量为S(n)=6(n+1)bytes(忽略与实例特征无关的空间需求量)。
  在这里插入图片描述
int n需要2bytes,返回地址需要2bytes,则每次函数调用需要4bytes,当n>=1时,递归算法的最大递归深度是n,当n<1时,最大递归深度是1,则递归算法的空间需求量S(n)=4*max{n,1}。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值