OCaml递归函数错误排查:累加元组列表首元素为0的次元素
解决你的OCaml递归函数问题
我来帮你排查代码里的问题,让它能正确实现你想要的功能!
先看看你的代码里存在的几个关键错误:
- 终止条件错误:你在列表为空的分支里写了
failwith("a"),这会导致遍历完所有元素后直接抛出异常——但递归累加的基准情况应该是空列表返回0(因为没有元素需要累加,初始值就是0),而不是抛出错误。 - 逻辑判断完全搞反:你的需求是当元组第一个值为0时累加第二个值,但原代码里的条件是
if a > 0 then b + tup(t)——这反而会在a大于0的时候去加b,完全和你的需求相反! - (小细节)函数调用写法不规范:OCaml里函数调用不需要给参数加括号,
tup(t)可以写成tup t,虽然不影响运行,但更符合OCaml的编码习惯。
接下来是修正后的代码:
let rec tup x = match x with | (a, b)::t -> if a = 0 then b + tup t else tup t | [] -> 0
测试一下你给的用例:
tup [(0, 2); (1, 10); (0, 20)]
运行后会返回22,完全符合你的预期。
简单解释下修正后的逻辑:
- 遍历列表时,遇到第一个元组,如果它的第一个值是0,就把第二个值加到剩余列表的累加结果上;
- 如果元组第一个值不是0,就直接递归处理剩余的列表,不做累加;
- 当列表为空时,返回0作为累加的基准值,递归到此结束,不会再抛出异常。
内容的提问来源于stack exchange,提问作者JackWu
相关产品推荐
相关产品推荐

