如何编写Python递归函数计算仅含+与*的字符串表达式结果
你的初始拆分思路完全可行,结合四则运算优先级调整拆分顺序即可实现需求,完全贴合课程给出的方法提示。
核心实现逻辑
- 修正递归终止条件:当字符串长度为1时,说明已经拆分到单个数字,需要用
int()转为整数返回(直接返回字符串会导致后续算术运算报错)。 - 拆分顺序遵循优先级规则:乘法运算优先级高于加法,因此优先拆分优先级更低的
+,没有加号时再拆分*:- 若当前字符串包含
+,调用split("+", 1)从第一个加号位置拆为左右两个子算式,分别递归计算两个子算式的结果,最终返回两个结果的和。 - 若当前字符串不存在
+,说明剩余运算全为乘法,调用split("*", 1)从第一个乘号位置拆为左右两个子算式,递归计算后返回两个结果的乘积。
- 若当前字符串包含
这个逻辑不需要额外写运算符位置遍历、优先级比对的复杂代码:低优先级运算最后执行,因此先拆分低优先级运算符,把高优先级的乘法运算留在子递归中优先计算,天然符合四则运算规则,和你“拆分到最小单元再按规则合并”的思路完全一致。
完整可运行代码
def calc(string): # 终止条件:拆分到单个数字,转整数返回 if len(string) == 1: return int(string) # 优先拆分加号(低优先级) if "+" in string: left, right = string.split("+", 1) return calc(left) + calc(right) # 无加号时拆分乘号 if "*" in string: left, right = string.split("*", 1) return calc(left) * calc(right) # 测试题目给定算式 c = "3+4*5+6+1*3" print(calc(c)) # 输出32,和手动计算结果一致:3 + (4*5) + 6 + (1*3) = 32
验证说明
你可以用其他仅包含个位数、+和*的算式测试,比如"2*3+4*2"会返回14,"1+2+3*4"会返回15,均符合先乘后加的运算规则。题目明确说明终止条件对应长度为1的场景,因此不需要处理多位数、其他运算符的边界情况,当前代码完全满足题目要求。
内容的提问来源于stack exchange,提问作者Kukaratscha
相关产品推荐
相关产品推荐

