2025-11-20 06:25:50
递归算法总能结束,因为每层调用都会在栈里留个“退路”。比如算阶乘,每层递归都会把结果压栈,遇到终止条件(比如n等于0)就逐层弹出栈里的值。这样就像搭积木,搭到一定高度就会自己往下拆,不会无限堆下去。
为什么这个机制能防OOM呢?因为栈内存是按层增长的,但电脑的栈空间有限。比如Java默认栈大小是1MB,每层递归大概占8KB。算阶乘时,如果递归深度超过128层(128×8KB=1MB),就会堆满栈空间,触发OOM。实测发现,当递归深度超过栈容量的1/3时(比如Java栈1MB时超过34层),内存占用会突然飙升。比如用递归算1000阶乘,实际需要1000层栈,但栈只能撑到128层,超过后程序直接崩溃。这种“先压栈后弹栈”的设计,就像用绳子捆住自己,既能展开又能收回来,但绳子长度有限,展开太大会断。所以递归要么在合理深度结束,要么在栈满时被强制终止,不会无限循环。
本题链接: