1.在堆上模拟函数调用栈
背景: 在看算法书时候, 很多地方提到要谨防递归的栈溢出问题.
分析: 递归调用时候, 有可能出现非常深的函数调用. 对于每次的函数调用, 都需要将函数体内的局部变量保存在栈上, 如果函数体内包含大量的局部变量, 那么每次递归都会占用大量的栈空间, 非常容易导致栈溢出崩溃.
经过分析发现, 递归的栈溢出主要是局部变量占用太多空间而导致的. 那么我们只要想办法将局部变量封装起来放在堆上, 那么就能减少栈上空间的占用, 从而防止栈溢出.
青蛙跳台阶问题的递归算法如下所示(Swift).
// 定义一个对象, 用来存储局部变量信息
class FakeStack {
var num: Int
init(num: Int) {
self.num = num
}
func nextStep() -> Int {
if num == 1 {
return 1
}
if num == 2 {
return 2
}
return FakeStack(num: num - 1).nextStep() + FakeStack(num: num - 2).nextStep()
}
}
//栈上的函数调用
let stepNumber = FakeStack(num: 10).nextStep()
print(stepNumber)
如有任何错误, 请不吝赐教.