理解OCaml中的基本递归
大家好,我正在尝试制作一个简单的递归方法,它只需要一个累加器和一个目标值。然后向累加器中添加一个,直到达到目标值。我对Ocaml非常陌生,但对java有着良好的背景 我写了一段代码,展示了我想在java中做什么:理解OCaml中的基本递归,ocaml,Ocaml,大家好,我正在尝试制作一个简单的递归方法,它只需要一个累加器和一个目标值。然后向累加器中添加一个,直到达到目标值。我对Ocaml非常陌生,但对java有着良好的背景 我写了一段代码,展示了我想在java中做什么: public static int rec(int acc,int target) { if (acc == target) { return 0; } else { return rec(acc+
public static int rec(int acc,int target) {
if (acc == target) {
return 0;
} else {
return rec(acc+1, target);
}
}
下面是我在Ocaml中模拟此代码的尝试:
let h_sequence x =
let rec helper acc x = function
| acc -> x
| _ -> helper acc+1 x
in
helper 0 x;;
但是,我得到以下错误:
Error: This expression has type 'a -> 'b -> 'a
but an expression was expected of type int
下面是我如何理解Ocaml代码的。我们有一个函数h_序列,它有一个参数x。在函数h_序列内部,我们有一个名为helper的递归函数,它有两个参数acc和x。如果acc=x,则返回x。否则,通过传入helper来启动递归,将一个添加到acc,然后返回x。输入后,它将传递helper函数,将acc设置为0,并将x设置为x。如果我的逻辑不正确,请告诉我。任何帮助都将不胜感激
编辑新代码:
let h_sequence x =
let rec helper acc x =
if acc = x then
acc
else
helper (acc+1) x
in
helper 0 x;;
正如@Flux所说,您的helper函数有3个参数。您还应注意,模式
acc
将匹配所有值。模式基本上由常量组成,模式中出现的任何名称都将匹配(并绑定)任何相应的值
要将x
与acc
进行比较,只需使用if语句即可
由于您并不真正想使用模式匹配,因此可以通过删除函数
来简化操作。对于helper函数,您将得到如下结果:
let rec helper acc x =
if x = acc then (* One of the cases *)
else (* The other case *)
let rec helper acc x = function
| zzz -> x (* Equivalent to `| _ -> x` *)
| _ -> helper acc+1 x
正如@Flux所说,您的helper函数有3个参数。您还应注意,模式
acc
将匹配所有值。模式基本上由常量组成,模式中出现的任何名称都将匹配(并绑定)任何相应的值
要将x
与acc
进行比较,只需使用if语句即可
由于您并不真正想使用模式匹配,因此可以通过删除函数
来简化操作。对于helper函数,您将得到如下结果:
let rec helper acc x =
if x = acc then (* One of the cases *)
else (* The other case *)
let rec helper acc x = function
| zzz -> x (* Equivalent to `| _ -> x` *)
| _ -> helper acc+1 x
。。。我们有一个名为helper的递归函数,它有两个参数acc和x
之所以出现此错误,是因为递归函数helper
实际上有三个“参数”:acc
,x
,以及另一个使用函数匹配的“参数”。错误消息为您提供了此线索('a->'b->'a
)
现在让我们看一下helper
函数:
let rec helper acc x =
if x = acc then (* One of the cases *)
else (* The other case *)
let rec helper acc x = function
| zzz -> x (* Equivalent to `| _ -> x` *)
| _ -> helper acc+1 x
错误:
功能
进行模式匹配。所有内容都将匹配模式zzz
,这意味着下一个模式(|uz->helper acc+1 x
)是无用的,因为它永远不会匹配。请注意,我已将模式的名称从您的acc
更改为zzz
,以强调功能实际上与模式匹配
helper acc+1 x
相当于(helper acc)+1 x
,这不是您想要的。它应该是helper(acc+1)x
解决方案
您应该使用=
而不是=
来处理x
为负值的情况
。。。我们有一个名为helper的递归函数,它有两个参数acc和x
之所以出现此错误,是因为递归函数helper
实际上有三个“参数”:acc
,x
,以及另一个使用函数匹配的“参数”。错误消息为您提供了此线索('a->'b->'a
)
现在让我们看一下helper
函数:
let rec helper acc x =
if x = acc then (* One of the cases *)
else (* The other case *)
let rec helper acc x = function
| zzz -> x (* Equivalent to `| _ -> x` *)
| _ -> helper acc+1 x
错误:
功能
进行模式匹配。所有内容都将匹配模式zzz
,这意味着下一个模式(|uz->helper acc+1 x
)是无用的,因为它永远不会匹配。请注意,我已将模式的名称从您的acc
更改为zzz
,以强调功能实际上与模式匹配
helper acc+1 x
相当于(helper acc)+1 x
,这不是您想要的。它应该是helper(acc+1)x
解决方案
您应该使用=
而不是=
来处理x
为负的情况。递归函数helper
实际上有三个“参数”:acc
,x
,以及另一个“参数”递归函数helper
实际上有三个“参数”:acc
,x
,以及另一个使用函数
匹配的“参数”。