我今天刚刚开始OCaml(和函数式编程),我正在尝试编写一个函数来计算数组中出现的“value”数量(tab)。 我试过了:
let rec count_occ tab value =
let rec count_rec idx time = function
| tab.length - 1 -> time
| _ when tab.(indice) == value-> count_rec (idx + 1) (time + 1)
| _ -> count_rec (indice + 1) time
in
count_rec 0 0
;;
不幸的是,由于语法错误,它无法编译,我找不到解决方案。
答案 0 :(得分:3)
let rec count_occ tab value =
上面的补充不是必需的。
let rec count_rec idx time = function
| tab.length - 1 -> time
您无法与表达式匹配。您希望像下一行一样使用警卫,或if
语句来测试这样的事情。 tab.length
也不存在,因为tab
是array
,而不是length
字段的记录。你想要Array.length tab
。
但实际上,你根本不需要function
。 function
与fun x -> match x with
相同,并暗示count_rec
的类型为int -> int -> int -> int
。
| _ when tab.(indice) == value-> count_rec (idx + 1) (time + 1)
未宣布 indices
;我假设你的意思是idx。此外,==
是物理上的平等,你真的想要=
。
| _ -> count_rec (indice + 1) time
in
count_rec 0 0
你有一个良好的开端,你的递归的基础知识是正确的,虽然一个边缘情况是不正确的,但一旦你修复了语法问题你应该能够解决一个小问题。
答案 1 :(得分:1)
最后我发布了我的最终代码:
let count_occ tab value =
let rec count_rec idx time =
if (Array.length tab) = idx then
time
else if (tab.(idx)) = value then
count_rec (idx + 1) (time + 1)
else
count_rec (idx + 1) time
in
count_rec 0 0
;;