如果您无法在Ocaml中使用可变状态,那么如何在递归函数中创建计数器变量。例如:
假设您有一个数据类型e,您想递归地对一个表达式(该数据类型)进行模式匹配。
Match expression (e: example) : int
|O(i) -> int x + 1
因此,在该示例中(有意省略了其他情况),如果找到O(i),则希望int x从0,+ 1 + 2 + 3 ...递增
当我尝试实现此功能时,它会显示“ unbound value int”。那么如何创建一个随每次迭代而变化的变量。
对不起,如果这没有道理。
答案 0 :(得分:0)
从命令式查看方式切换到功能性查看方式的一种方法是,想象您要更改的每个变量都是函数的参数。当您要更改变量的值时,可以调用传递新值的函数。
这听起来很疯狂(或者也许不是),但这实际上是FP中的工作方式。
下面是一些必要的代码,用于计算5在整数列表中出现的次数:
let how_many_5s l =
let rest = ref l in
let count = ref 0 in
while !rest <> [] do
if List.hd !rest = 5 then
count := !count + 1;
rest := List.tl !rest
done;
!count
以下是执行相同操作的功能代码。上面代码中修改的变量,剩余列表和计数器是内部函数的参数。
let how_many_5s_functional list =
let rec inner count list =
match list with
| [] -> count
| 5 :: t -> inner (count + 1) t
| _ :: t -> inner count t
in
inner 0 list
答案 1 :(得分:0)
我不确定您要问的是什么,使用的是什么语法(不是OCaml),但是由于您提到了“递归”和“计数器变量”,因此我将在说明方面进行一些尝试如何使用此示例在递归过程中增加计数器,该示例构造了一个列表,其编号范围为a
至b
(包括以下数字):
let rec range a b =
if a > b then
[]
else
a :: range (a + 1) b
对于每次迭代,a
的值将增加1,直到达到b
,并且通过将a
添加到运行{{ 1}}递归增加range
。