2013-12-16 34 views
0

我在OCaml中编写了一个应该计算前100个响铃号码的程序。 这里是我的代码(我使用的是Num模块):OCaml中的响铃号码

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 = 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) 

这是我在这第一个程序语言。编译它时遇到一些问题。

+0

我认为你应该从阅读一些关于语法的教程开始,例如http://ocaml.org/learn/tutorials/。 – Kakadu

+0

更具体地说,您可以将'while'循环重写为for循环。你总是增加整数变量,这就是为什么循环是你所需要的。 – Kakadu

+0

另外,您应该更具体地指定您的问题,例如,通过提供错误日志。不要忘记'let .. = ..'作为顶级表达式最终不需要'in'。但是如果在另一个'let'中使用'let',你应该在cos#中添加'in'关键字 – Kakadu

回答

0

在上次let n = ref 100结束时,您错过了;;。但是,使用全局变量作为算法的辅助变量,它被认为是不好的风格。下面的代码是来自问题的代码的最小修复和而不是对不良风格的其他方面的认可,如不使用for循环中提到的评论。

(* #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) 
+0

好。 THX为您提供帮助。 – czarnywdowiec