Functional programming 使用递归从命令式编程到函数式编程

Functional programming 使用递归从命令式编程到函数式编程,functional-programming,ocaml,Functional Programming,Ocaml,我对函数式编程非常陌生。我正在努力使用递归而不是for循环。这是我到目前为止所拥有的 let max_factor n = let rec loop k = if k >= n then [] else begin if k < n && n % k = 0 then k :: loop(k+1) end 设最大系数n= 让rec循环k= 如果k>=n,则[] 其他的 开始 如果

我对函数式编程非常陌生。我正在努力使用递归而不是for循环。这是我到目前为止所拥有的

let max_factor n = 
  let rec loop k = 
    if k >= n then [] 
    else
      begin
        if k < n && n % k = 0 then
          k :: loop(k+1)
      end 
设最大系数n=
让rec循环k=
如果k>=n,则[]
其他的
开始
如果k

我的计划是将那些插入到列表中,然后从列表中找到最大的。但我觉得我做错了。对于函数式编程,它总是像“四处走动”一样,还是我就是不擅长这个?我的方法有问题吗?有人能告诉我如何处理这个简单的问题吗…

与java代码等效的是

let max_factor (n : int) : int = 
  let rec loop i = 
    if i < 2 then 1
    else if n mod i = 0 then i
    else loop (i-1)
  in loop (n / 2);; (* you don't want to start at n, which would trivially divide n *)
let max_因子(n:int):int=
让rec循环i=
如果i<2,则为1
否则,如果n mod i=0,则i
else循环(i-1)
环路内(n/2);;(*您不希望从n开始,这将很容易地除以n*)

为什么要列出?为什么递归会增加
k
?@Bergi list:因为我不知道如何立即返回最大的一个。它增加k,所以我可以检查1到n,看哪一个有最大的因子,但这不是您在java循环中选择的简单方法,在java循环中,您向下迭代,只返回找到的第一个(最大)因子。(顺便问一下,你的意思是
返回i
而不是
返回n
?)请原谅我的无知,但是val max_factor:int->int选项有什么作用?是否用于将返回值设置为最大_因子?我们必须这样做吗:int->int option??当我编译它的时候,它说“这个表达式有int类型,但是一个表达式应该是'a option'类型”,它应该是函数的类型签名。很抱歉,我的Ocaml有点生疏:-)谢谢你的更新,但它说“错误的类型((int*int)*(int*int))列表。”@Rosababoy该错误一定来自代码中的其他地方。我现在已经更新了一个我实际试用过的版本,它在repl中工作