You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 02:42:04