OCaml中的递归帮助

dar*_*n21 0 recursion ocaml

我试图用Ocaml做一个递归函数,但我一直得到相同的错误代码.

let rec get x =
if x > 7 then
get x-7;;
Run Code Online (Sandbox Code Playgroud)

我得到了非常有用的错误信息:

错误:此表达式的类型为int,但表达式的类型为unit

我是OCaml的初学者,并在大学学习模块.这是我的任务之一,我有点卡住了!

我原本想通过一个while循环来做(因为我是一个占主导地位的程序员),但我无法让它工作,所以我想我会尝试递归!

谢谢

gsg*_*gsg 7

这段代码存在两个问题.首先,间距x-7表示您要传递x - 7get它,但它实际上将被解析为(get x) - 7.用括号很容易修复:

let rec get x =
  if x > 7 then get (x - 7)
Run Code Online (Sandbox Code Playgroud)

第二个问题是你没有第二只手臂if,因此该功能没有太多机会返回任何东西.(一只手臂if被认为是类型unit,只对效果有用.)

如果x小于7,你可能想要返回一些东西,也许:

let rec get x =
  if x > 7 then get (x - 7) else x
Run Code Online (Sandbox Code Playgroud)

用while循环编写它是可能的,但你应该理解OCaml中的变量不是可变位置,只是名称.您必须明确地引入和操作可变位置:

let get x =
  let y = ref x in
  while !y > 7 do
    y := !y - 7;
  done;
  !y
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.