OCaml递归函数统计列表奇偶整数数量:调用仅返回类型而非结果
问题分析与解决方案
你的代码问题出在函数调用参数不全:countEvenOdd定义时需要三个参数(列表、偶数计数初始值、奇数计数初始值),但你调用时只传了列表。OCaml的函数是柯里化的,所以此时返回的是一个等待接收剩余两个int参数的函数,这就是输出显示int -> int -> int * int类型的原因。
下面提供两种解决方式:
方式一:直接传入初始调用参数
在调用时补充初始计数的0值,让函数完成完整的递归计算:
let rec countEvenOdd lst e o = match lst with | [] -> (e,o) (* Base case: empty list *) | hd :: tl -> if hd mod 2 = 0 then countEvenOdd tl (e + 1) o else countEvenOdd tl e (o + 1) ;; countEvenOdd [2;4;5;6;7;8] 0 0;;
执行后会返回正确结果:- : int * int = (4, 2)
方式二:封装递归函数(更优雅)
将带累加参数的递归逻辑封装为内部辅助函数,对外暴露只接收列表的入口,避免用户手动传入初始值:
let countEvenOdd lst = let rec helper current_lst even_count odd_count = match current_lst with | [] -> (even_count, odd_count) | hd :: tl -> if hd mod 2 = 0 then helper tl (even_count + 1) odd_count else helper tl even_count (odd_count + 1) in helper lst 0 0 ;; countEvenOdd [2;4;5;6;7;8];;
调用后直接返回结果:- : int * int = (4, 2)
内容的提问来源于stack exchange,提问作者J.B
相关产品推荐
相关产品推荐

