【问题标题】:OCAML function doesn't print correctlyOCAML 功能无法正确打印
【发布时间】:2021-05-09 10:46:44
【问题描述】:

所以我必须创建一个“熄灯”游戏。我必须创建两个函数。一个功能“翻转”

val 翻转 : bool array array -> int -> int -> bool array array =

表示给定一个bool矩阵和两个整数i,j。它否定了价值观 (真→假,假→真)在矩阵中的位置i,j,以及否定 (最多)4 个水平/垂直相邻元素的值。

这是我的代码:

`

let matrixz =         [|[|true;true;false;false|];
                      [|false;false;true;true|];
                      [|true;false;true;false|];
                      [|true;false;false;true|]|];;

let flip_matrix matrix a b=
let n=Array.length matrix in
    for i=1 to n do 
 let n1=Array.length matrix in
      for j=1 to n1 do
        if i=a && j=b
        then begin 
            matrix.(i).(j)<- not matrix.(i).(j);
            matrix.(i+1).(j)<- not matrix.(i+1).(j);
            matrix.(i).(j+1)<- not matrix.(i).(j+1); 
            matrix.(i).(j-1)<- not matrix.(i).(j-1);
            matrix.(i-1).(j)<- not matrix.(i-1).(j);
        end;
       done;
    done;
matrix;; `

我认为是正确的。但我还必须做另一个功能:

val print_matrix : bool array array -> unit =

给定一个布尔矩阵,它将它打印在屏幕上(真→“T”,假→“F”)。

这是我的代码:

let print_s matrix=
  let n=Array.length matrix in
    for i=0 to n-1 do 
      let n1=Array.length matrix in
        for j=0 to n1-1 do
         print_string matrix.(i).(j);
        done; 
       print_string "/n";
      done;

这将是正确的输出:

# flip matrix 1 4;;
# print_matrix matrix;;
FTFT
TFFF
FFTT

我知道第二个函数不正确。我非常感谢 Ocaml 的一些帮助和建议。

【问题讨论】:

    标签: ocaml imperative


    【解决方案1】:

    首先,如果您的代码格式正确,将更容易识别。空间很便宜,所以不要犹豫。

    let matrixz =         
      [|[|true; true; false; false|];
        [|false; false; true; true|];
        [|true; false; true; false|];
        [|true; false; false; true|]|]
    
    let flip_matrix matrix a b =
      let n = Array.length matrix in
      for i = 1 to n do 
        let n1 = Array.length matrix in
        for j = 1 to n1 do
          if i = a && j = b then 
          begin 
            matrix.(i).(j) <- not matrix.(i).(j);
            matrix.(i + 1).(j) <- not matrix.(i+1).(j);
            matrix.(i).(j + 1) <- not matrix.(i).(j + 1); 
            matrix.(i).(j - 1) <- not matrix.(i).(j - 1);
            matrix.(i - 1).(j) <- not matrix.(i - 1).(j);
          end;
        done;
      done;
      matrix
    

    这同样适用于您的 print_s 函数。

    let print_s matrix =
      let n = Array.length matrix in
      for i = 0 to n - 1 do 
        let n1 = Array.length matrix in
        for j = 0 to n1 - 1 do
          print_string matrix.(i).(j);
        done; 
        print_string "/n";
      done
    

    这可行,但有两个问题。 print_string matrix.(i).(j) 期望 matrix.(i).(j) 是一个字符串,但它是一个布尔值。您必须将其转换为字符串。 OCaml 是非常强类型的,因此它不会为您隐式进行这种转换。

    第二个非常简单,当您弄清楚类型问题时。打印 /n 不会给你换行符。打印\n会。

    另外,您不妨研究一下Array模块中的iter函数来实现打印。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多