递归实现正整数乘法时遭遇栈溢出(Maximum call stack size exceeded)问题的解决咨询
递归实现正整数乘法时遭遇栈溢出(Maximum call stack size exceeded)问题的解决咨询
嘿,我来帮你看看这个问题~首先你的基础递归逻辑是对的,但栈溢出的问题根本不是要“限制栈大小”,反而得从减少递归深度入手,咱们一步步拆解:
为什么会出现栈溢出?
Python默认的递归深度限制大概在1000左右(你可以用import sys; print(sys.getrecursionlimit())查看当前值)。你的代码里递归深度等于参数b的大小——比如如果b是2000,那就要递归2000次,直接超过了Python的栈上限,自然就报错了。
怎么解决?
1. 先优化递归深度(最简单的调整)
咱们可以交换a和b,让较小的那个数作为递归的次数,这样递归深度就变成了min(a,b),大大减少递归次数。比如原来a=10000、b=2要递归9999次,交换后只需要递归1次:
def multiply(a, b): # 交换a和b,让较小的数作为递归参数,减少深度 if a < b: return multiply(b, a) if b == 0: return 0 if b == 1: return a return a + multiply(a, b - 1)
2. 改用迭代实现(彻底避免栈问题)
如果不想用递归,直接用循环累加就完全不会有栈溢出的问题,同样可以优化循环次数:
def multiply(a, b): result = 0 # 选小的数来循环,减少循环次数 if a < b: a, b = b, a for _ in range(b): result += a return result
3. 分治法递归(大幅降低递归深度)
利用乘法分配律做分治,把递归深度降到对数级别(比如b=10000时,递归深度仅约14次),完全不会触碰到栈上限:
def multiply(a, b): if b == 0: return 0 # 偶数情况:a*b = a*(b//2)*2 if b % 2 == 0: return multiply(a * 2, b // 2) # 奇数情况:a*b = a*(b-1) + a else: return a + multiply(a, b - 1)
关于修改栈大小的误区
虽然你可以用sys.setrecursionlimit()手动调高递归深度上限,但这是治标不治本的办法——调得太小还是会溢出,调太大可能导致程序崩溃,所以非常不推荐。
备注:内容来源于stack exchange,提问作者Pranav S
相关产品推荐
相关产品推荐

