OCaml中的贝尔数

OCaml中的贝尔数,ocaml,Ocaml,我正在用OCaml编写一个程序,它应该能计算出前100个钟形数字。 这是我的代码(我正在使用Num模块): 计算阶乘: let rec factorial n = if n < 2 then one else (num_of_int n) */ factorial(n-1) 让rec阶乘n= 如果n

我正在用OCaml编写一个程序,它应该能计算出前100个钟形数字。 这是我的代码(我正在使用
Num
模块):

计算阶乘:

let rec factorial n = 
    if n < 2 
    then one
    else (num_of_int n) */ factorial(n-1) 
让rec阶乘n=
如果n<2
然后一个
else(整数的个数)*/factorial(n-1)
计算牛顿:

让rec newton n k=
阶乘n//(阶乘k*/阶乘(n-k))
设bell=Array.make 101为零;;

贝尔。(0)你错过了一个
在最后一个
末尾,让n=ref 100
。但使用全局变量作为算法的辅助变量被认为是不好的风格。下面的代码是对问题代码的最小修正,而不是对不良风格的其他方面的认可,比如不使用注释中提到的
循环

(* #load "nums.cma";; if in toplevel *)
open Num
let one = num_of_int 1;;
let zero = num_of_int 0;;

let rec factorial n = 
  if n < 2 
  then one
  else (num_of_int n) */ factorial(n-1) 

let rec newton n k =
  factorial n // (factorial k */ factorial (n-k))

let bell input =
  let bell = Array.make (input+1) zero in
  bell.(0) <- one;
  bell.(1) <- one;

  let i = ref 2 in
  let k = ref 0 in
  let x = ref zero in
  let suma = ref zero in
  let n = ref input in

  if !n <> 0 || !n <> 1 then
    while !i <= !n do   
      while !k <= (!i-1) do
        x := newton (!i-1) !k;
        suma := !suma +/ (!x */ bell.(!k));
        k := !k + 1 
      done;
      bell.(!k) <- (!suma);   
      suma:= zero;
      k:=0;
      i:= !i + 1;
    done;

  bell.(input)
(*#加载“nums.cma”;如果在顶级*)
打开数值
设一=num_of_int 1;;
设0=num_of_int 0;;
设rec阶乘n=
如果n<2
然后一个
else(整数的个数)*/factorial(n-1)
让我们记录牛顿n k=
阶乘n//(阶乘k*/阶乘(n-k))
让钟声输入=
设bell=Array.make(输入+1)为零

bell.(0)例如,我认为您应该从阅读有关语法的教程开始。更具体地说,您可以将
while
循环重写为
for
循环。您总是递增整数变量,这就是为什么您需要for循环。此外,您应该更具体地指定您的问题,例如,通过提供错误日志。别忘了让
作为顶级表达式,最终不需要在
中使用
。但是如果你在另一个
let
中使用
let
,你应该在
关键字中添加
,特别是,你遗漏了一个
在最后一个
末尾,让n=ref 100
。但无论如何,使用全局变量作为算法的辅助变量被认为是一种不好的风格。在没有正式学习ocaml的情况下,人们会继续使用ocaml做Java的事情,这就是sadOK。谢谢你的帮助。
let rec newton n k =
    factorial n // (factorial k */ factorial (n-k))

let bell = Array.make 101 zero;;
bell.(0) <- one;;
bell.(1) <- one;;

let i = ref 2
let k = ref 0
let x = ref zero
let suma = ref zero
let n = ref 100

if !n != 0 || !n != 1 then
    while !i <= !n do   
        while !k <= (!i-1) do
            x := newton (!i-1) !k;
            suma := !suma +/ (!x */ bell.(!k));
            k := !k + 1 
        done;
        bell.(int_of_num !k) <- (!suma);   
        suma:= zero;
        k:=0;
        i:= !i + 1;
    done;;

bell.(int_of_num 20)
(* #load "nums.cma";; if in toplevel *)
open Num
let one = num_of_int 1;;
let zero = num_of_int 0;;

let rec factorial n = 
  if n < 2 
  then one
  else (num_of_int n) */ factorial(n-1) 

let rec newton n k =
  factorial n // (factorial k */ factorial (n-k))

let bell input =
  let bell = Array.make (input+1) zero in
  bell.(0) <- one;
  bell.(1) <- one;

  let i = ref 2 in
  let k = ref 0 in
  let x = ref zero in
  let suma = ref zero in
  let n = ref input in

  if !n <> 0 || !n <> 1 then
    while !i <= !n do   
      while !k <= (!i-1) do
        x := newton (!i-1) !k;
        suma := !suma +/ (!x */ bell.(!k));
        k := !k + 1 
      done;
      bell.(!k) <- (!suma);   
      suma:= zero;
      k:=0;
      i:= !i + 1;
    done;

  bell.(input)