处理OCaml中的列表时的随机答案

时间:2013-10-13 10:51:14

标签: list recursion ocaml

我正在尝试制作一个能让我获得生命游戏中活细胞数量的功能。 目标是查看一个int列表列表,并给定一个单元格的坐标,返回它旁边的活动单元格数。
问题是我的函数似乎完全随机回答,我没有看到代码中可能导致这种情况的原因 这是一个课堂作业,所以我不是要求一个具体的答案,只是为了暗示问题可能在哪里

这是我的代码:

(* nth : reimplementation of List.nth that returns 0 if there is no such
 * element
 * [int list -> int -> int] *)

 let rec nth l n =
    match l with
        | [] -> 0
        | a::l -> if n = 0 
            then a 
            else nth l (n-1);;

(* get_cell : given a couple of coordinates, returns the value at the
 * coordinates on the matrix 
 * [int * int -> int list list -> int] *)

let rec get_cell (x,y) matrix = 
    match (List.nth matrix y) with
        | [] -> empty
        | l  -> nth l x;;

(* count_neighbours : given a couple of coordinates and a matrix, returns the 
 * number of alive cells in the neighborhood of the designed cell 
 * [int * int -> int list list -> int] *)

let count_neighbours (x,y) matrix =
    let neighbors = [ (x-1,y-1); (x-1,y); (x-1,y+1); 
                      (x,y-1); (x,y+1);
                      (x+1,y-1); (x+1,y); (x+1,y+1); ] in
    let rec aux = (function 
        | [] -> 0
        | h::t -> (get_cell h matrix) + aux (t)
    ) in
    aux neighbors;;

这是一个示例会话:

# let test_board = [[0; 1; 1; 1; 1]; [1; 0; 0; 0; 0]; [1; 0; 1; 0; 0]; [0; 1; 0; 0; 0];
   [0; 1; 1; 0; 1]];;
val test_board : int list list =
  [[0; 1; 1; 1; 1]; [1; 0; 0; 0; 0]; [1; 0; 1; 0; 0]; [0; 1; 0; 0; 0];
   [0; 1; 1; 0; 1]]
# count_neighbours (3,3) test_board;;
- : int = 3
# get_cell (2,2) test_board;;
- : int = 1
# get_cell (2,3) test_board;;
- : int = 0
# get_cell (2,4) test_board;;
- : int = 1
# get_cell (3,2) test_board;;
- : int = 0
# get_cell (3,4) test_board;;
- : int = 0
# get_cell (4,2) test_board;;
- : int = 0
# get_cell (4,3) test_board;;
- : int = 0
# get_cell (4,4) test_board;;
- : int = 1

如你所见,随机结果...... 谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

据我了解,除非您指定随机性,否则它不是完全随机。 : - )

我很确定使用正确的坐标来获取你的细胞只是一件小事。既然你已经提到这是一个家庭作业,我只会指出你要获得解决方案,而不是一个人。

List.nth test_board x给你什么? x是您在上面输入的任何数字。

经过一些小的调整之后,我的结果就是这样:

# get_cell (2,4) test_board;;
- : int = 0
# count_neighbours (3,3) test_board;;
- : int = 3
祝你好运。

修改 对于count_neighbours实现,如果您将其视为列表列表,将会有所帮助,如下所示。

拿你的test_board,看起来像这样的oCaml编译器:

    0  1  2  3  4
0  [0; 1; 1; 1; 1];
1  [1; 0; 0; 0; 0]; 
2  [1; 0; 1; 0; 0]; 
3  [0; 1; 0; **0**; 0];
4  [0; 1; 1; 0; 1];

我突出显示了与(3, 3)对应的单元格。这里显示了三个1 - 左上角,左下角和右下角。